问题
执行这个函数时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里你是用run还是start来开始程序。
或者直接go起个协助程来跑就可以了。
你没理解到我的意思,我既然选择shell来执行,肯定有要我的用处嘛,我是用来后台运行go应用,通过这个命令实现常住。
jarlyyn@debian:/tmp/go$ cat test.go package main
import ( "fmt" "os/exec" "time" )
func main() { cmd := exec.Command("sh", "-c", "tail -f 1.txt") go func() { fmt.Println(cmd.Run()) }() time.Sleep(time.Second) } jarlyyn@debian:/tmp/go$ ps -A|grep tail jarlyyn@debian:/tmp/go$ go run test.go jarlyyn@debian:/tmp/go$ ps -A|grep tail 14758 pts/5 00:00:00 tail jarlyyn@debian:/tmp/go$
打一段字回复前,可能跑个简单的测试程序效率更高。
谢谢你的回复,但是我问题的重点是
nohup &
这个命令通过go调用shell包正确执行的问题。请问这个问题你最终是怎么解决的?我也遇到了一个类似问题
我也遇到了这个问题,已经解决
首先,这不是一个bug 其次,这个现象是因为你go程序运行( 主程A),启动shell子进程B, A是B的父进程,父进程退出,B就跟着退出了,B并没有被init 1进程接管,这是导致这个问题的原因
解决方案:
我最后把他改成了这样
谢谢你的建议。