Linux 中后台进程和守护进程之间的区别

nmd*_*_07 3 linux daemon process background-process server

后台进程不属于用户和终端,守护进程也不属于用户和终端。两者之间的主要区别是什么?如果我要编写一个服务器程序,我应该将其作为后台进程还是守护进程运行?

Jer*_*ian 7

当人们说“后台进程”时,通常是在 shell 的上下文中(如 bash),它实现作业控制

当进程(或进程组)置于后台时,它仍然是 shell 创建的会话的一部分,并且仍然与 shell 的控制终端有关联。后台进程的标准输入/输出仍将链接到终端(除非明确更改)。此外,根据 shell 退出的方式,它可能会SIGHUP向所有后台进程发送信号(请参阅答案以了解确切的时间)。在 shell 终止之前,它仍然是后台进程的父进程。

另一方面,守护进程没有控制终端,通常明确地成为 init 进程的子进程。大胆的标准输入/输出通常重定向到/dev/null


小智 5

后台进程通常是指以下进程:

\n
Another process is its parent; eg, a shell;\nIt has standard streams (input, output, error) connected to that parent\n
Run Code Online (Sandbox Code Playgroud)\n

最常见的类型是当您运行带有尾随 & 的 shell 程序时。它通常共享 shell\xe2\x80\x99s 输出流,但如果它尝试从输入流中读取,则会收到信号并停止。

\n

更重要的是(通常),像这样的后台进程仍然是父进程,因此发送给该进程组的信号将继续它。如果父进程终止,子进程也将收到很可能终止它们的信号。(对于大多数用户来说,这可能是两者之间最大的区别。)

\n

守护进程是这样​​的进程:

\n
Has no parent, ie, its parent process is the system (or container) initial thread, commonly systemd (Linux), init (other Unix), or launchd? (MacOS);\nTypically has its output disconnected, or connected to a log file;\nTypically has its input disconnected.\n
Run Code Online (Sandbox Code Playgroud)\n

守护进程通常也被编写为接受\xe2\x80\x9cuser挂起\xe2\x80\x9d信号(SIGHUP),如果不处理该信号将终止程序,作为重新读取其配置文件并继续工作的特殊指令。

\n

大多数情况下,这些进程是由某些系统级设施创建的,完全独立于用户活动(登录、注销等)继续运行。本身处理登录的事物(getty 或 gdm 等)以及其他面向网络的服务(Web 服务器、邮件服务器等)可能是守护进程,以及像 cron 或 smartd 这样的自我监控服务。

\n