go - 使用重定向到文件启动分离命令

标签 go process io

我试图在一个分离的进程中启动一个命令,以便它可以在 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/

相关文章:

go - 在 go 中实现 io.WriterAt 的缓冲区

go - 有没有办法在本地机器上拥有所需的模块而不是让它们联机

c++ - 读取二进制文件的惯用 C++17 标准方法是什么?

java - 在方法参数中指定文件类型

go - 如何跟踪一个类型的实例数?

windows - 捕获 Windows 终端正在运行的进程关闭

internet-explorer - IE9中的脚本错误

C : Redirect child process output to other child process input and stdout

c++ - ios::fmtflags如何在C++中工作?setf()如何工作?

go - slice 作为 map 中的键