后台进程和守护进程都不属于用户和终端。两者的主要区别是什么?如果我要编写一个服务器程序,应该将其作为后台进程还是守护进程运行?
后台进程和守护进程都不属于用户和终端。两者的主要区别是什么?如果我要编写一个服务器程序,应该将其作为后台进程还是守护进程运行?
后台进程(Background process)通常指的是以下过程:
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这样的自我监控服务。