sigterm, systemd 以及RemainAfterexit
昨天使用uwsgi和Nginx在Debian 9上部署一个python程序。完成后给uwsgi写了一个systemd文件,想通过systemd来管理uwsgi的启动和停止。
文件内容如下:
[Unit] Description=mediadrop service (uWsgi) After=syslog.target [Service] ExecStart=/bin/bash -c 'cd /opt/apps; source venv/bin/activate;uwsgi --ini-paste deployment.ini' KillSignal=SIGTERM [Install] WantedBy=multi-user.target
测试时发现,能够正常启动,但是过了两、三分钟左右进程就会停掉、检查系统日志发现是由于进程收到了TERM型号继而KILL信号导致退出。我对于这个unit文件中KillSignal的作用并不理解,查了一下是用于指定系统要关闭进程时应该发送的信号的名称。那应该也不会导致刚把uwsgi启动就要发送TERM信号。继续搜索,说是加上RemainAfterExit=yes可以解决这个问题,测试了一下。确实如此。因此,把unit文件变为:
[Unit] Description=mediadrop service (uWsgi) After=syslog.target [Service] ExecStart=/bin/bash -c 'cd /opt/apps; source venv/bin/activate;uwsgi --ini-paste deployment.ini' RemainAfterExit=yes [Install] WantedBy=multi-user.target
但是还是不明白为什么uwsgi会收到TERM信号,为什么有进程要关闭它呢?
仔细看了一下RemainAfterExit的作用:
RemainAfterExit=
Takes a boolean value that specifies whether the service shall be considered active even when all its processes exited. Defaults to no
.
我想应该是我们使用了bash来执行一串命令,而bash在执行完这些指令后退出,所以systemd认为所有的它的子进程(包括它启动的uwsgi)也应该退出,所以给这些进程发送了TERM信号,要他们退出,在没有收到回应的情况下又发送了KILL信号,将这些进程强制退出。
参考:
http://man7.org/linux/man-pages/man5/systemd.kill.5.html
https://www.freedesktop.org/software/systemd/man/systemd.service.html
https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files