巧用kill重新加载配置并启动进程

背景

前期在服务器上使用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
    7
    $ pstree -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
2
3
4
5
6
7
8
9
10
11
12
13
14
# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

通过上述命令可以看到SIGHUP是1号信号,也就是说kill -1 pidkill -HUP pid是等效的。

logstash中,我们使用kill -1 pid 来实现重新加载配置,其实也是这个道理。