解決方法:
1.輸出重定向,用run執行,output會獲取內容,run只是執行,out, err := exec.Command("/bin/sh", "-c", “test.sh”).Output()
func main() {
f, _ := os.Create("1.txt")
cmd := exec.Command("su", "-", "user00", "-c", "cd /tmp;nohup sh 1.sh &")
cmd.Stdout = os.Stdout
cmd.Stderr = f
cmd.Run()
2.在nohup的命令中添加>/dev/null 2>&1
nohup top >/dev/null 2>&1 &
(24條消息) go cmd nohup 的坑_weixin_30843605的博客-CSDN博客
https://github.com/go-cmd/cmd/issues/20
(24條消息) nohup /dev/null 2>&1 含義詳解_楊航JAVA的博客-CSDN博客
why:
目前沒找到問題為什么會發生
這里僅猜測下
exec.Command 的方法有很多,run(), start(),wait(),output, 其實output調用了run,run調用了start和wait,start表示開始執行命令,wait表示進程執行命令結束
start表示go的主進程一直有一個協程在與命令交互,交互方式可能是通過stdout進行交互,wait應該是等待stdout句柄的關閉
nohup top &表示一直執行top命令,且將輸出輸出到stdout,這樣wait就一直等不到輸出結束,如果nohup top > /dev/null &表示將stdout的輸出重定向到/dev/null,原有句柄關閉
wait就執行完成了
wait的調用棧有一個
syscall.WaitForSingleObject(syscall.Handle(handle), syscall.INFINITE)
后續在繼續跟進把