声明:
参考材料:https://zhuanlan.zhihu.com/p/53212013
以及
是什么
守护进程是终端不能控制的进程,不受终端信号控制。ctrl+Z、ctrl+C等不会影响到这个进程。
比如带了-D选项的gunicorn:gunicorn -D main:app
实现方式
底层是Linux的setsid命令。 setsid函数将创建新的会话,并使得调用setsid函数的进程成为新会话的领头进程。就类似于新开一个terminal,用新的terminal生成新的进程,然后使得这个进程又脱离掉这个新开终端,使得其父母进程“消失”(但实际好像是交给init进程托管了?)。
控制
那要控制怎么办?还是可以控制的。
-
停止
需要查看那个守护进程的id号,pstree -ap|grep gunicorn
找到后,输入如下指令关闭进程:
kill -9 pid
kill -9和普通kill的区别? 普通kill是软的,告诉进程该停止了,而进程有自主选择权,可以忽略,-9加上后,即可死亡,没有其他选择。 -
重启
输入如下指令重启进程:
kill -HUP pid
HUP是“更改配置而不需停止并重新启动服务”。
其他相关命令
前台进程:就普通的进程,开始后会占住终端一直运行,ctrl+C结束运行。比如apt-get install
等等。
后台进程:基本上是加了&
符号的,比如python xxx.py&
,开了后就在后台运行,可以使用fg (foreground)调到终端前台来。
加了nohup进程:当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。nohup能够屏蔽此信号,不会中断,一般用来挂到后台去等结果。比如模型训练:nohup python xxx.py&
以上进程都不是守护进程(daemon)。
错误、无营养无意义的帖子如下:
- 这个知乎下的所有答案。https://www.zhihu.com/question/451747320
- https://blog.csdn.net/qq_29855509/article/details/106616261
- https://blog.csdn.net/weixin_33694172/article/details/94670883
以及其他很多。