【问题标题】:Start a detached process on Windows using Golang使用 Golang 在 Windows 上启动分离的进程
【发布时间】:2021-11-02 16:14:59
【问题描述】:

我有一个 Golang 代码,它必须运行一个分离的子进程。

我的 Linux 版本使用 syscall.ForkExec 就像这样。

syscall.ForkExec(my_program, []string{}, nil)

但我找不到 Windows 实现。我找到了一个使用START /B 的提议。

cmd := exec.Command("START", "/B", my_program)
cmd.Start()

很遗憾,找不到START,我没有其他使用 Golang 的解决方案。

【问题讨论】:

  • START 是一个程序吗?它在你的道路上吗?是否缺少.exe 扩展名?工作 ForkExec 使用的确切参数是什么(尽管 Linux 实现也应该使用 os/exec 包,而不是直接使用 syscall
  • 你应该看看StartProcessgolang.org/pkg/os/#StartProcess
  • @Ravi: os/exec 应该是首选,来自文档:它包装了 os.StartProcess 以便更轻松地重新映射标准输入和标准输出,将 I/O 与管道连接,以及执行其他操作调整。
  • START 是命令行中可用的程序,但我无法在C:\Windows\System32 中找到它。对于 Linux,我使用 syscall 分离子进程而不是 os/exec
  • @JimB start 是 Windows 命令行解释器 (cmd.exe) 的(内部)命令。 Details.

标签: windows go


【解决方案1】:

start 不是独立应用程序,它是 Windows 命令行解释器 (cmd.exe) 的(内部)命令(详细信息:Command line reference / Start),因此您需要一个“shell”来运行 start命令。

cmd.exe/C 参数一起使用,并传递start 和您的应用程序以运行。

就像这个例子:

s := []string{"cmd.exe", "/C", "start", `c:\path\to\your\app\myapp.exe`}

cmd := exec.Command(s[0], s[1:]...)
if err := cmd.Run(); err != nil {
    log.Println("Error:", err)
}

或者没有命令切片:

cmd := exec.Command("cmd.exe", "/C", "start", `c:\path\to\your\app\myapp.exe`)
if err := cmd.Run(); err != nil {
    log.Println("Error:", err)
}

如果您不想要已启动应用程序的终端窗口,您也可以像这样将/b 参数传递给start

cmd := exec.Command("cmd.exe", "/C", "start", "/b", `c:\path\to\your\app\myapp.exe`)
if err := cmd.Run(); err != nil {
    log.Println("Error:", err)
}

【讨论】:

  • 谢谢!正是我的问题的解决方案。
  • 作为澄清,因为答案中没有提到它;即使父程序以非零代码退出,子进程仍然存在。 (windows下os.exec不提供)
【解决方案2】:

我不清楚你所说的分离是什么意思。如果您的意思是“不要等待程序完成”,那么您不需要外壳:

package main
import "os/exec"

func main() {
   exec.Command("firefox", "google.com/search?q=golang").Start()
}

https://golang.org/pkg/os/exec#Cmd.Start

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 2010-12-17
    • 2019-06-03
    相关资源
    最近更新 更多