nohup 返回 golang 程序

问题描述 投票:0回答:3

我们正在尝试从 golang 执行 nohup 脚本,这是我们执行的命令

cmd := exec.Command("nohup","sh",destinationDirPath + "/pf_file_monitor.sh","&>",destinationDirPath + "/nohup.out","&")
_,err = cmd.Output();

问题是执行此命令后,控制权没有返回到程序。

有人可以帮我吗?

go nohup
3个回答
2
投票

看来有些事情出了问题。我重写了下面的代码,但让我首先明确地解决每个问题,以便我可以解释我认为困惑的地方并解释我的更改:

  • destinationDirPath + "/pf_file_monitor.sh"
    - 这在技术上并没有错误,但使用
    filepath.Join
    更惯用(也更可靠);作为一般规则,除非有充分的理由,否则您永远不应该手动连接路径字符串
  • $>
    - 我假设您在这里尝试执行的操作是将命令的输出重定向到日志文件。这里的问题是,符号
    $>
    仅当您位于 shell 中时才有意义(如
    sh
    bash
    )。另一方面,Go 只是将其视为另一个命令行参数,并将其作为参数传递给程序。因此,您必须手动执行此操作。在下面给出的示例中,我所做的就是打开文件,然后将
    cmd
    的 stdout 和 stderr 管道(这些是
    io.Writer
    控制 stdout 和 stderr 的位置)设置为文件句柄。
  • 它不会在后台运行。这里的问题是您正在使用
    Run
    方法,该方法将运行命令并阻止直到完成。相反,您需要
    Start
    方法,该方法仅启动命令,然后立即返回,以便您的程序可以继续运行。

希望这有帮助!这是更新的实现:

script := filepath.Join(destinationDirPath, "pf_file_monitor.sh")
log := filepath.Join(destinationDirPath, "nohup.out")
cmd := exec.Command("nohup", "sh", script)

f, err := os.Create(log)
if err != nil {
    // handle error
}

// redirect both stdout and stderr to the log file
cmd.Stdout = f
cmd.Stderr = f

// start command (and let it run in the background)
err = cmd.Start()
if err != nil {
    // handle error
}

0
投票

这是原来的命令

nohup ./tools migrate --offset 1 >> ./migrate_`date +%Y%m%d%H%M`.log 2>&1 &

这是我的感悟


    var command *exec.Cmd
    var date = time.Now().Format("200601021504")
    logFileName := "migrate_"+date+".log"
    logFile, err := os.OpenFile(logFileName, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0755)
    if err != nil {
        return
    }
    var arg = strings.Split("migrate --offset=1", " ")
    command = exec.Command("./tools", arg...)
    command.Stdout = logFile
    command.Stderr = logFile
    err = command.Start()
    if err != nil {
        return
    }

有效


0
投票

您是否尝试过在 bash 脚本中运行相同的

nohup
命令,然后从 golang exec.Cmd 调用 bash 脚本,看看它是否返回到 golang 程序或卡住。当我实验时,它会被卡住,除非您将 nohup 的输出重定向到文件或 null。

作品:

nohup /home/test/test.sh >/dev/null 2>&1 &

被挂

nohup /home/test/test.sh &

© www.soinside.com 2019 - 2024. All rights reserved.