Skip to content

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

Avatar

专业Linux/Unix/Windows系统管理员,开源技术爱好者。对操作系统底层技术,TCP/IP协议栈以及信息系统安全有强烈兴趣。电脑技术之外,则喜欢书法,古典诗词,数码摄影和背包行。

Sidebar