go 執行exec.Command中帶有nohup的操作會掛起


解決方法:

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)
后續在繼續跟進把

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM