我正在追求"守护进程"具有此功能的模式:
func daemon(nochdir, noclose int) int {
ret, _, err := syscall.Syscall(syscall.SYS_FORK, 0, 0, 0)
if err != 0 {
maybe_exit_err("Forking", err)
return -1
}
switch ret {
case 0:
break
default:
os.Exit(0)
}
sid, err2 := syscall.Setsid()
maybe_exit_err(fmt.Sprintf("could not set session: %s", sid), err2)
if sid == -1 {
return -1
}
if nochdir == 0 {
os.Chdir("/")
}
if noclose == 0 {
f, e := os.OpenFile("/dev/null", os.O_RDWR, 0)
if e == nil {
fd := int(f.Fd())
syscall.Dup2(fd, int(os.Stdin.Fd()))
syscall.Dup2(fd, int(os.Stdout.Fd()))
syscall.Dup2(fd, int(os.Stderr.Fd()))
}
}
return 0
}
只要我不使用time.Sleep(1 * time.Second)
,该程序就可以正常工作。在那之后,它只是坐在那里什么都不做,我甚至在一个循环中添加了写测试字符串到我自己打开的文件中,并且在使用time.Sleep
之后没有写入任何内容(如果没有,它可以正常工作)。
这可能是什么原因?
操作系统:Debian Linux 7.2 x64 去版本:1.2
答案 0 :(得分:1)
我似乎遇到了运行时的一般问题:https://code.google.com/p/go/issues/detail?id=6664
更新:
G ++ 1:https://github.com/sevlyar/go-daemon
SO - 1