【发布时间】:2020-04-20 15:09:18
【问题描述】:
后台进程不属于用户和终端,守护进程也不属于。两者的主要区别是什么?如果我要编写一个服务器程序,我应该将它作为后台进程还是守护进程运行?
【问题讨论】:
-
“后台进程不属于用户和终端” - 你是怎么得出这个结论的?
标签: linux server process background-process daemon
后台进程不属于用户和终端,守护进程也不属于。两者的主要区别是什么?如果我要编写一个服务器程序,我应该将它作为后台进程还是守护进程运行?
【问题讨论】:
标签: linux server process background-process daemon
当人们说“后台进程”时,它通常是在 shell(如 bash)的上下文中,它实现了job control。
当一个进程(或process group)进入后台时,它仍然是shell 创建的会话的一部分,并且仍然与shell 的控制终端有关联。后台进程的标准输入/输出仍将链接到终端(除非明确更改)。此外,根据 shell 的退出方式,它可能会向所有后台进程发送SIGHUP 信号(请参阅this 回答以了解确切时间)。在 shell 终止之前,它仍然是后台进程的父进程。
另一方面,守护进程没有控制终端,通常显式设置为 init 进程的子进程。敢的标准输入/输出通常重定向到/dev/null
【讨论】:
后台进程通常指的是这样的进程:
Another process is its parent; eg, a shell;
It has standard streams (input, output, error) connected to that parent
最常见的类型是当您运行带有尾随 & 的 shell 程序时。它通常共享 shell 的输出流,但如果它试图从其输入流中读取,它会收到一个信号并停止。
更重要的是(通常),像这样的后台进程仍然是父进程,因此向该进程组发出的信号将继续发送给它。如果父进程终止,子进程也将收到最有可能终止它们的信号。 (对于大多数用户来说,这可能是两者之间最大的区别。)
守护进程是:
Has no parent, ie, its parent process is the system (or container) initial thread, commonly systemd (Linux), init (other Unix), or launchd? (MacOS);
Typically has its output disconnected, or connected to a log file;
Typically has its input disconnected.
守护进程通常也被编写为接受“用户挂起”信号 (SIGHUP),如果不处理该信号将终止程序,作为重新读取其配置文件并继续工作的特殊指令。
大多数情况下,这些进程是由某些系统级工具创建的,它们继续完全独立于用户活动(登录、注销等)运行。自己处理登录(getty 或 gdm 等)以及其他面向网络的服务(Web 服务器、邮件服务器等)的东西可能是守护进程,以及像 cron 或 smartd 这样的自我监控服务。
【讨论】: