什么是守护程序?


12

我听到很多关于在我的Ubuntu计算机上运行的守护程序的讨论-它们是什么?

Answers:


15

简而言之,守护进程是一个后台进程

守护程序只能是在后台运行的普通程序,但是大多数守护程序是通过启动进程,将其派生并退出父进程创建的。

派生一个进程意味着创建它的精确副本。如果真正的父进程立即终止,则该进程的父进程现在是位于的初始化进程/sbin/init,这是在每个类Unix操作系统上启动的第一件事。现在,该过程称为守护程序,它没有与之关联的TTY。

这是Python中的守护程序的示例:

import sys, os, time

pid = os.fork()

# there now exist two processes
if pid > 0: # If this is the parent,
    sys.exit(0) # quit.

# this is the background part:
time.sleep(5)
print "Hello, World!"

严格来说,这还不是一个。您还必须更改当前的工作目录,将标准输入和输出恢复为日志文件,等等。您可以阅读此Wikipedia文章中的血腥细节。

如果您运行该示例,则即使在命令行上启动的过程已终止,您也会在两秒钟后注意到它会打印出来。此过程的副本现在由“ init”运行。


8
对此进行扩展,如果您要从Windows进入Linux,则可以将守护程序视为Windows“服务”的* nix等效项。
nathwill 2011年

1
@ stefano-palazzo您说“ ...它没有关联的TTY”,但随后“ ...您会注意到,两秒钟后它会打印...”。我以为拆下TTY意味着您无法写终端。
豪尔赫·布卡拉

1
@JorgeBucaran是的。打印有点顽皮。它仍然可以处理启动它的tty的标准输出流。当您打开一个文件(例如/ dev / stdout)时,您会得到一个数字(称为文件描述符),只要打开该文件的进程仍在运行,这就是您需要写的所有内容(您可以看到)中打开的文件/proc/*/fd。行为良好的守护程序将通过放弃对stdout,stderr和stdin的句柄,将自己完全与tty分离。
Stefano Palazzo

1
@StefanoPalazzo我明白了。可以保留对父进程std / out / err的引用,并且仍然与之分离。如果我可以随意保留对TTY的引用,那么分离一个进程意味着什么?我发现< superuser.com/questions/178587/… >有用,但仍然不清楚。
Jorge Bucaran

1
@JorgeBucaran意味着用您创建的新进程(例如日志文件)覆盖进程自己的stdio(例如,通过使用dup2)。这是一个完整的例子
Stefano Palazzo

1

在多任务计算机操作系统中,守护程序是一种计算机程序,它作为后台进程运行,而不是在交互式用户的直接控制下运行。传统上,守护程序的进程名称以字母d结尾,以澄清该进程实际上是一个守护程序,并区分守护程序和普通计算机程序。例如,syslogd是实现系统日志记录工具的守护程序,而sshd是为传入的SSH连接提供服务的守护程序。

如您所见,守护程序层


2
报价从哪里来?
Zanna

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.