本文是一篇经验性的文章分享,主要是用来分享在使用 uWSGI 运行后台服务的过程中,更新服务时需要先杀掉当前运行的 uWSGI 服务进程,然而却出现 uWSGI 进程无法正常杀掉/结束的情况时的解决方案。

阅读文章的过程中如果有任何疑问,欢迎添加笔者为好友,拉您进【七日书摘】微信交流群,一起交流技术,一起打造高质量的职场技术交流圈子,抱团取暖,共同进步。
七日书摘官方群.jpg

uWSGI 的安装可以参考uWSGI官方指南->安装uWSGI ,但是考虑到 uWSGI 安装会依赖 PythonC compiler 等组件,因此我极力推荐大家使用 Anaconda 进行安装和管理。此节 uWSGI 的安装简单介绍主要是为了想验证本文后续内容提供一个简要支持。

uWSGI 安装完成后,即可使用 uwsgi --ini uwsgin.ini 命令启动 uWSGI 服务进程,服务进程启动后可以通过 cat uwsgi.pid 或者 ps aux | grep uwsgi 查看当前 uWSGI 服务进程信息。

cat uwsgi.pid查看当前 uWSGI 服务进程信息

注意cat uwsgi.pid命令中uwsgi.pid需要根据具体的日志目录来查看,比如程序运行在/home/myuwsgi/目录下,此时该文件会在/home/myuwsgi/目录或者/home/myuwsgi/log/目录下。

使用cat uwsgi.pid查看运行信息时,在打开的文件中会有如下信息:

WSGI app 0 (mountpoint='') ready in 7 seconds on interpreter 0x26db010 pid: 14614 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 14614)
spawned uWSGI worker 1 (pid: 14619, cores: 1)
spawned uWSGI http 1 (pid: 14620)

其中uWSGI master process是主进程信息,uWSGI worker 1是工作线程信息,uWSGI http 1是负责处理http请求的工作线程信息。

此时如果使用kill 14614kill 14614 14619 14620或者如下命令:

kill `pidof uwsgi`

会发现无论你执行多少次上述命令,uWSGI 服务进程都会自动重启。

ps ax | grep uwsgi查看当前 uWSGI 服务进程信息

使用ps ax | grep uwsgi查看运行信息时,会显示如下信息:

14614 ?        S      0:26 uwsgi --ini xxx.ini
14619 ?        Sl    10:56 uwsgi --ini xxx.ini
14620 ?        S      0:36 uwsgi --ini xxx.ini

此时如果重复上述 kill 命令进杀死 uWSGI 服务进程信息,会发现 uWSGI 服务进程都会自动重启。

究其原因,其实上述 kill 命令执行时,默认会发送SIGTERM,因此会导致 uWSGI 服务进程会重启,而不是结束。

因此,要解决此问题,可以使用以下几种方式进行解决:

killall -s INT uwsgi
pkill -f uwsgi -9

注意:此命令行中的 uwsgi 是uwsgi安装路径,安装路径可以使用 which uwsgi 查找。

扩展阅读
killall -s INT uwsgi 命令中 INT 可以通过 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

其中 INT 表示 2) SIGINT ,因此该命令也可以改写成如下形式 killall -s 2 uwsgi
同样 killall -s 9 uwsgi 也满足以上要求。

------完------

更多学习讨论欢迎进入七日书摘官方群: 七日书摘官方群

七日书摘官方群群聊二维码.png

参考资源:
How to kill all instance of uwsgi
how to kill uWSGI process
Python uWSGI 安装配置