在 shell 中守护进程?

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

来自维基百科关于 daemon 的文章

在 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)

我认为您甚至不必重定向标准输入、标准输出和标准错误。

  • 看看 [daemonize](http://software.clapper.org/daemonize/)。除了一个不错的工具之外,它对守护程序是什么有很好的解释。 (3认同)