Tim*_*Tim 10 linux bash daemon
http://linuxg.net/how-to-transform-a-process-into-a-daemon-in-linux-unix/给出了一个在 bash 中守护进程的例子:
$ nohup firefox& &> /dev/null
Run Code Online (Sandbox Code Playgroud)
如果我是对的,该命令与“nohup 和后台进程”相同。但是守护进程不只是一个 nohupped 和后台进程吗?
这里缺少哪些步骤来守护进程?
例如,在守护进程时是否不需要更改父进程?如果是,你如何在 bash 中做到这一点?我仍在尝试了解相关回复https://unix.stackexchange.com/a/177361/674。
还有哪些步骤和条件?
看我的相关问题/sf/ask/2499381601/
Gen*_*sky 10
在 Unix 环境中,守护进程的父进程通常(但不总是)是 init 进程。守护进程通常要么由进程创建子进程创建,然后立即退出,从而使 init 采用子进程,要么由 init 进程直接启动守护进程。此外,通过分叉和退出启动的守护进程通常必须执行其他操作,例如将进程与任何控制终端 (tty) 分离。此类过程通常在各种便利例程中实现,例如Unix 中的daemon(3)。
阅读该daemon函数的联机帮助页。
从立即退出的 shell 运行后台命令会导致进程的 PPID 变为 1。易于测试:
# bash -c 'nohup sleep 10000 &>/dev/null & jobs -p %1'
1936
# ps -p 1936
PID PPID PGID WINPID TTY UID STIME COMMAND
1936 1 9104 9552 cons0 1009 17:28:12 /usr/bin/sleep
Run Code Online (Sandbox Code Playgroud)
如您所见,该进程归 PID 1 所有,但仍与 TTY 相关联。如果我从这个登录 shell 注销,然后再次登录,然后再做ps一次,TTY 就会变成?.
在这里阅读为什么与 TTY 分离很重要。
使用setsid(部分util-linux):
# bash -c 'cd /; setsid sleep 10000 </dev/null &>/dev/null & jobs -p %1'
9864
# ps -p 9864
PID PPID PGID WINPID TTY UID STIME COMMAND
9864 1 9864 6632 ? 1009 17:40:35 /usr/bin/sleep
Run Code Online (Sandbox Code Playgroud)
我认为您甚至不必重定向标准输入、标准输出和标准错误。