本文是一篇经验性的文章分享,主要是用来分享在使用 uWSGI
运行后台服务的过程中,更新服务时需要先杀掉当前运行的 uWSGI
服务进程,然而却出现 uWSGI
进程无法正常杀掉/结束的情况时的解决方案。
阅读文章的过程中如果有任何疑问,欢迎添加笔者为好友,拉您进【七日书摘】微信交流群,一起交流技术,一起打造高质量的职场技术交流圈子,抱团取暖,共同进步。
uWSGI
的安装可以参考uWSGI官方指南->安装uWSGI ,但是考虑到 uWSGI
安装会依赖 Python
和 C 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 14614
、kill 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
也满足以上要求。
------完------
参考资源:
How to kill all instance of uwsgi
how to kill uWSGI process
Python uWSGI 安装配置