我试图在一个分离的进程中启动一个命令,以便它可以在 go 程序退出后继续。我需要将命令的输出重定向到一个文件。
我需要的是这样的:
func main() {
command := exec.Command("/tmp/test.sh", ">", "/tmp/out")
if err := command.Start(); err != nil {
fmt.Fprintln(os.Stderr, "Command failed.", err)
os.Exit(1)
}
fmt.Println("Process ID:", command.Process.Pid)
}
显然这样的重定向是行不通的。由于我在启动长时间运行的命令后立即退出程序,因此无法打开文件并将其绑定(bind)到 Stdout。
有什么办法可以实现这样的重定向吗?
最佳答案
您可以启动一个 shell 来执行您的命令/应用程序,并且您可以将其输出重定向到一个文件。即使您的 Go 应用程序退出,shell 也会继续运行并执行您的脚本/应用程序。
例子:
cmd := exec.Command("sh", "-c", "/tmp/test.sh > /tmp/out")
if err := cmd.Start(); err != nil {
panic(err)
}
fmt.Println("Process ID:", cmd.Process.Pid)
使用这个简单的 Go 应用程序对其进行测试(将 /tmp/test.sh
替换为您将其编译成的可执行二进制文件的名称):
package main
import ("fmt"; "time")
func main() {
for i := 0; i < 10; i++ {
fmt.Printf("%d.: %v\n", i, time.Now())
time.Sleep(time.Second)
}
}
这个应用只是每秒向标准输出打印一行。您可以看到输出文件是如何写入的,例如使用 tail -f/tmp/out
。
请注意,您可以根据自己的喜好(以及 test.sh
脚本的指示)使用其他 shell 来执行脚本。
例如使用bash
:
cmd := exec.Command("/bin/bash", "-c", "/tmp/test.sh > /tmp/out")
// rest is unchanged
请注意,要由 shell 执行的命令是作为单个 string
参数传递的,它不会像直接在命令提示符。
关于go - 使用重定向到文件启动分离命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40243197/