3 回答
TA贡献1847条经验 获得超7个赞
Start()即使在其父进程死亡后,被分叉的进程仍将继续。
func forker() {
cmd := exec.Command("sleep", "3")
cmd.Start()
time.Sleep(2 * time.Second)
os.Exit(1)
}
在这里,sleep即使父进程只存活 2 秒,该进程也会愉快地存活 3 秒:
$ forker &; while true; do ps -f; sleep 1; done
UID PID PPID C STIME TTY TIME CMD
501 71423 69892 0 3:01PM ttys003 0:00.07 forker
501 71433 71432 0 3:01PM ttys003 0:00.00 sleep 3
UID PID PPID C STIME TTY TIME CMD
501 71423 69892 0 3:01PM ttys003 0:00.07 forker
501 71433 71432 0 3:01PM ttys003 0:00.00 sleep 3
UID PID PPID C STIME TTY TIME CMD
501 71433 1 0 3:01PM ttys003 0:00.00 sleep 3
通知父进程ID(如何PPID)的的sleep过程变得1当父进程71432退出。这意味着该sleep进程已被孤立。
TA贡献1876条经验 获得超6个赞
似乎立即放弃的好策略是os.Argv[0]
生成进程(自生成),然后生成目标进程(使用 Setsid:true),然后退出第一个生成的进程。这样 gradchild 进程立即获得 ppid 1。可选地,第一个衍生的进程可以在退出之前通过 stdout 将孙子的 pid 传递给父进程。
TA贡献1877条经验 获得超1个赞
在Start()方法应该给你你在找什么。我的示例 Go 程序终止后附加一个简单文本文件的脚本继续运行:
package main
import (
"os/exec"
)
func main() {
cmd := exec.Command("./appender.sh")
cmd.Start()
}
- 3 回答
- 0 关注
- 153 浏览
添加回答
举报