在Shell中守护进程?


9

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

$ nohup firefox& &> /dev/null

如果我正确的话,该命令与“ nohup和后台进程”相同。但是,守护进程是否仅是经过预配置和后台运行的进程?

这里缺少什么步骤来守护进程?

例如,守护进程时是否不需要更改父进程?如果是,您将如何使用bash进行操作?我仍在尝试理解相关的回复https://unix.stackexchange.com/a/177361/674

还有哪些其他步骤和条件?

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


1
取决于您对守护程序的定义。如果您只是想在与终端分离的后台运行,则可以,您正在将firefox作为守护程序运行。但是,“标准”守护程序通常不是由用户运行的,具有初始化脚本和日志记录,并且通常具有某种安全性,通常取决于您运行的是Ubuntu还是Fedora(或类似版本)而采用apparmor或selinux。参见linfo.org/daemon.html

1
start-stop-daemon 在Debian中看看; 我将从堆栈溢出stackoverflow.com/questions/16139940/…中留下一个相关的线程,它比原始手册页更有趣
Rui F Ribeiro

Answers:


10

有关守护程序维基百科文章

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

阅读daemon功能手册。

从立即退出的外壳程序运行后台命令会导致该进程的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相关联。如果我从此登录外壳注销,然后再次登录,然后再次执行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。


3
看一下daemonize。除了一个不错的工具外,它还对守护程序是什么有很好的解释。
Gene Pavlovsky

我只是想知道您是否知道一种从tty分离进程而又不从产生该进程的shell注销的方法?
StoneThrow

1
@StoneThrow“无需注销从其产生进程的外壳中退出”如果使用bash -c包装,则与该进程没有关联的TTY。真的就像他展示了它。
布鲁诺·布罗诺斯基

@StoneThrow,但是执行此测试echo "outer tty: $(tty)"; ls -la $(dirname $(tty)); bash -c 'echo "inner tty: $(tty)"; ls -la $(dirname $(tty));'将向您显示这两者都是完全相同的TTY,但是?即使您从未“退出shell”或关闭TTY,也仍然表现出获得TTY为的行为。
布鲁诺·布鲁诺斯基

-1

守护进程,其名称无非是一个运行到1.系统关闭的程序。2.要求停止。除此之外,它没有魔术的意义。

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

您期望找到什么而找不到?如果您有任何问题,请提供示例代码和示例数据段,以寻求进一步的帮助。您目前的问题太笼统了。


谢谢。我认为我的帖子已满足您在上一段中的所有要求。
蒂姆(Tim)

4
嗯,这不是真的。守护程序没有控制终端,没有stdout或stderr以及其他一些东西。阅读software.clapper.org/daemonize
Rich Homolka
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.