几天前把自己折腾 Jenkins 的经历写了写,链接在这儿

其中有个脚本,是 git pull 以后重启 nginx 和 uwsgi 的脚本,原来内容是这样的:

killall -9 'uwsgi -x blog.xml'
find . -name "*.pyc" | xargs rm -rf
uwsgi -x blog.xml
nginx -s reload

后来发现几个问题:

  1. killall -9 ‘uwsgi -x blog.xml’ 这条命令是无效的,因为找不到
  2. 第二句话是清除 pyc 文件的,发现在网站启动时删除是删不掉的
  3. 第一句无效第三局就当然无效了

还是太年轻啊……

下面是改进后的脚本:

uwsgi --reload ./uwsgi.pid
nginx -s reload

其实我的目的很简单,就是 pull 代码以后使 uwsgi 和 nginx 重新加载新代码,发现我以前的方法太笨了,其实 uwsgi 有 reload 参数的,就像上面那么写。(常用的还有个 stop , uwsgi –stop /var/run/uwsgi.pid)

这样就要求在 uwsgi 的配置文件中加一句话:

<pidfile>./uwsgi.pid</pidfile>

就是 uwsgi 启动时把 pid 写入 pidfile 中,然后 pull 代码后只 reload 这个 pid 的uwsgi。

为什么要这么做呢?因为我的 VPS 上有两个程序,所以起了两个 uwsgi 主进程,我想让两个之间不互相影响,所以要制定 pid reload。