背景
前期在服务器上使用gunicorn
托管了一个flask
项目,近期修改了配置要重启一下。于是查了下如何优雅的重启进程。
思路
修改配置重启进程,最简单的方法就是使用ps -ef|grep xxx
命令来找到对应的进程,然后kill -9 pid
来结束进程在重新启动。
对于gunicorn
来说,稍微有点不同。一般会启动多个worker
来跑,比如
1 | gunicorn -w 4 manager:app |
这样的话,使用平常的ps -ef|grep gunicorn
就会发现有多个进程,有时候直接kill
后还会自动启动。
正确的方法是:
通过
pstree
来找到gunicorn
的主进程:1
2
3
4
5
6
7pstree -ap|grep gunicorn
| |-grep,18737 --color=auto gunicorn
| `-gunicorn,18205/home/torandom/.local/share/virtualenvs/ToRandom-w9b3mFRo/bi
| |-gunicorn,17455/home/torandom/.local/share/virtualenvs/ToRandom-w9b3mFRo/bi
| |-gunicorn,17456/home/torandom/.local/share/virtualenvs/ToRandom-w9b3mFRo/bi
| |-gunicorn,17457/home/torandom/.local/share/virtualenvs/ToRandom-w9b3mFRo/bi
| `-gunicorn,17458/home/torandom/.local/share/virtualenvs/ToRandom-w9b3mFRo/bi这里就会看到,主进程是18737
然后在通过
kill
命令来结束进程1
kill -9 18737
在启动
gunicorn
。
这时候发现了有另外一个kill
命令,可以直接让进程重新加载配置并启动,这就是
1 | kill -HUP 18737 |
重启之后再次使用pstree
会发现guncorn
的进程号发生了变化,即原进程已经销毁,新建了新的进程。
http://www.chenxm.cc/article/561.html
结论
经查询,这其实是liunx
中带信号的kill
命令起的作用。上述命令其实是对进程发送了一个HUP
信号,而很多程序会把HUP
信号作为重新读取配置文件的触发条件,当接收到这个信号的时候,不会杀死进程,而是重新读取配置并运行。
1 | kill -l |
通过上述命令可以看到SIGHUP
是1号信号,也就是说kill -1 pid
和kill -HUP pid
是等效的。
在logstash
中,我们使用kill -1 pid
来实现重新加载配置,其实也是这个道理。