解决方法:
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)
后续在继续跟进把