## 问题
执行这个函数时``execShell("nohup ./hatgo &")``,**&**被``exec.Command``自动屏蔽了,导致最后应用无法后台运行 ,麻烦大家给我指教一下。
```
func execShell(s string) {
cmd := exec.Command("sh", "-c", s)
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
checkErr(err, out.String())
}
```
我也遇到了这个问题,已经解决
首先,这不是一个bug
其次,这个现象是因为你go程序运行( 主程A),启动shell子进程B, A是B的父进程,父进程退出,B就跟着退出了,B并没有被init 1进程接管,这是导致这个问题的原因
解决方案:
1. nohup命令是为了让程序忽略hangup 信号, 这里这样使用不太合适。我们的目的是为了A退出后,B能够被init 1进程接管,所以可以换一种方式,修改shell命令,使用setsid让其后台运行。比如:
setsid tail -f 1.txt
参考文档: https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/
2. go程序exec有一种方式, 可以通过在Cmd.SysProcAttr字段中将Setpgid设置为true来实现, 这种方式我没有实际尝试,楼主可以自行尝试下,然后可以分享出来,原理是一样的
#8
更多评论
bug.....
你现要了解&有什么用。
带&和不带&,其实就相当于 go里你是用run还是start来开始程序。
或者直接go起个协助程来跑就可以了。
#1