uWSGI 通过 xxx.ini 启动后会在相同目录下生成一个 xxx.pid 的文件,里面只有一行内容是 uWSGI 的主进程的进程号。
启动:
uwsgi --ini xxx.ini
重启:
uwsgi --reload xxx.pid
停止:
uwsgi --stop xxx.pid
以上是当前网上对于uwsgi重启操作的最常见的描述,但是笔者通过ini文件启动时发现并没有生成xxx.pid文件。于是自然的想法是通过shell脚本获取进程号并进行kill操作,脚本如下:
#!/bin/bash
PIDS=`ps -ef | grep uwsgi | grep -v grep | awk '{ print $2 }'`
if [ "$PIDS" ]
then
kill -9 $PIDS
uwsgi --ini uwsgi.ini
echo "uwsgi restarted."
else
echo "restart failed."
fi
获取进程号的命令需要包含在``或$()之间,笔者在此过程中遇到过两个问题,描述如下:
- too many arguments错误
引起该错误的原因是
if [ "$PIDS" ]
中变量未加双引号,加上双引号该问题解决。
- arguments must be process or job IDs
引起该问题的原因可能是shell脚本文件名中包含了uwsgi字符串,此时PIDS中会包含执行此shell脚本的进程号,从而试图删除该脚本进程,造成该错误,解决方法为通过grep -v忽略当前脚本即可。
PIDS=`ps -ef | grep {process_name} | grep -v grep | grep -v sh | awk '{ print $2 }'`