1 回答

TA貢獻1824條經驗 獲得超6個贊
所以似乎有一些事情正在絆倒。我已經重寫了下面的代碼,但讓我首先明確地解決每個問題,以便我可以解釋我認為的混淆是什么并解釋我的更改:
destinationDirPath + "/pf_file_monitor.sh"
- 這在技術上沒有錯,但使用起來更慣用(也更可靠)filepath.Join
;作為一般規則,除非有充分的理由,否則永遠不應該對路徑進行手動字符串連接$>
- 我假設您在這里嘗試做的是將命令的輸出重定向到日志文件。這里的問題是該符號$>
僅在您處于 shell 中時才有意義(例如sh
或bash
)。另一方面,Go 只是將其視為另一個命令行參數,并將其作為參數傳遞給程序。因此,您將不得不手動執行此操作。在我下面給出的示例中,我所做的是打開文件,然后將cmd
的 stdout 和 stderr 管道(這些是io.Writer
控制 stdout 和 stderr 去向的 s )設置為文件句柄。它不會在后臺運行。這里的問題是您正在使用該
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
}
- 1 回答
- 0 關注
- 457 瀏覽
添加回答
舉報