sigterm, systemd 以及RemainAfterexit

sigterm, systemd 以及RemainAfterexit

昨天使用uwsgi和Nginx在Debian 9上部署一个python程序。完成后给uwsgi写了一个systemd文件,想通过systemd来管理uwsgi的启动和停止。 文件内容如下:

  测试时发现,能够正常启动,但是过了两、三分钟左右进程就会停掉、检查系统日志发现是由于进程收到了TERM型号继而KILL信号导致退出。我对于这个unit文件中KillSignal的作用并不理解,查了一下是用于指定系统要关闭进程时应该发送的信号的名称。那应该也不会导致刚把uwsgi启动就要发送TERM信号。继续搜索,说是加上RemainAfterExit=yes可以解决这个问题,测试了一下。确实如此。因此,把unit文件变为:

但是还是不明白为什么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

Read More