解决方法:

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)
后续在继续跟进把

 

posted on 2022-04-02 10:38  莱芜梆子  阅读(927)  评论(0编辑  收藏  举报