在 shell 中守护进程?

在 shell 中守护进程?

http://linuxg.net/how-to-transform-a-process-into-a-daemon-in-linux-unix/给出了在 bash 中守护进程的示例:

$ nohup firefox& &> /dev/null

如果我是正确的,该命令与“nohup 和后台进程”相同。但守护进程不就是一个 nohup 的后台进程吗?

这里缺少哪些步骤来守护进程?

例如,当进程守护进程时,是否不需要更改父进程?如果是的话,你如何在 bash 中做到这一点?我还在尝试理解相关回复https://unix.stackexchange.com/a/177361/674

还有哪些步骤和条件?

看我的相关问题https://stackoverflow.com/q/35705451/156458

答案1

来自维基百科关于守护进程的文章:

在 Unix 环境中,守护进程的父进程通常(但并非总是)是 init 进程。守护进程通常是由进程派生子进程然后立即退出,从而导致 init 采用子进程创建的,或者是由 init 进程直接启动守护进程创建的。此外,通过分叉和退出启动的守护进程通常必须执行其他操作,例如将进程与任何控制终端 (tty) 分离。这些过程通常以各种方便的例程来实现,例如守护进程(3)在Unix中。

阅读该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

正如您所看到的,该进程属于 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

我认为你甚至不必重定向 stdin、stdout 和 stderr。

答案2

守护进程,顾名思义,就是一个运行直到1.系统已关闭;2.要求停止。除此之外,它没有什么神奇的意义。

在这种情况下,使用nohup在后台运行bash脚本,可以将其归类为守护进程。

您期望找到什么而没有找到什么?如果您遇到任何问题,请用示例代码和示例数据段说明,以寻求进一步的帮助。你现在的问题太宽泛/笼统了。

相关内容