Go语言 如何启动一个子进程,当我的主进程退出时,它也退出

xzlaal3s  于 2023-01-06  发布在  Go
关注(0)|答案(2)|浏览(786)

我有一个简单的Go应用程序,它偶尔会在后台运行bash脚本。
为了简单起见,我只是在后台启动一个网页的chrome。

#!/bin/env bash

chrome https://www.google.com

现在会发生两件事:
1.已经有一个chrome窗口打开。在这种情况下,chrome会在现有窗口中打开URL并退出。

  1. chrome窗口还没有打开,在这种情况下,chrome命令成为chrome主进程,并绑定到浏览器窗口,这意味着如果我不关闭浏览器窗口,进程也不会退出,* 如果我的Go程序退出,浏览器也会退出(因为它是一个子进程)。
    我不希望第二种情况发生!因为在这种情况下,如果我退出应用程序chrome也退出,我不希望那样。
    我是否可以在Go语言中启动一个进程(比如exec.Command),然后将它从应用程序中完全断开,这样这个进程就可以独立运行了(不会和我的进程一起退出,也不会阻塞它)?
wbgh16ku

wbgh16ku1#

这似乎对我很有效:

package main
import "os/exec"

func main() {
   exec.Command(`C:\Windows\notepad`).Start()
}

关于Wait,如果你调用Wait,它本质上和调用Run是一样的。Wait的要点是它允许你在命令开始和等待它完成之间放置代码。
Run形成对比的是,在Run中,"Start"和"Wait"一个接一个地发生,没有在两者之间放置任何东西的选项,或者在本例中,您根本不需要Wait
https://golang.org/pkg/os/exec#Cmd.Start

9o685dep

9o685dep2#

答案将取决于操作系统,我将假设您使用windows执行此任务。
通过使用--user-data-dir参数,您可以让它启动一个新的目录。

package main

import (
    "os"
    "os/exec"
)

func main() {
    path := "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
    cmd := exec.Command(path, "--user-data-dir="+os.Getenv("localappdata")+"\\Google\\Chrome\\InstalledApps\\organisation-name\\project-name")
    cmd.Start()
}

Chrome将独立运行
注意--user-data-dir创建了一个chrome文件夹,每个应用程序的大小在16 mb到100 mb之间不断变化。
如果你想做相反的事情,主进程被附加到chrome进程(双向打开/关闭),那么你可以使用一个信号和cmd。

package main

import (
    "os"
    "os/exec"
    "os/signal"
    "syscall"
)

func main() {
    path := "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
    cmd := exec.Command(path, "--user-data-dir="+os.Getenv("localappdata")+"\\Google\\Chrome\\InstalledApps\\organisation-name\\project-name")
    cmd.Start()

    signalHandler := make(chan os.Signal, 1)
    signal.Notify(signalHandler, os.Interrupt, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)

    // running till terminal (termination)
    go func() {
        <-signalHandler // waiting for termination
        cmd.Process.Kill()
    }()

    // running till exit chrome window
    cmd.Wait()
}

相关问题