php-fpm重新启动后,PHP杀死exec()后台进程

时间:2017-09-27 20:28:28

标签: php linux nginx exec background-process

我使用的是nginx和php7.1-fpm。我想使用PHP和exec()运行后台进程。

我的简短代码:

<?php
exec('/usr/local/bin/program > /dev/null 2>&1');

不幸的是,在 systemd restart php7.1-fpm 之后程序被杀了。

我尝试使用与运行池的用户不同的用户运行:

<?php
exec('sudo -u another_user /usr/local/bin/program > /dev/null 2>&1');

然而,这并没有解决问题 - 仍然会杀人。

我不能使用ssh2_connect()。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

这似乎是由于php-fpm service管理systemd

php-fpm启动的所有进程都属于其控制组,当您重新启动服务时,systemd会将SIGTERM发送到控制组中的所有进程,即使它们已被守护,分离和/或属于另一场会议。

您可以使用以下命令检查控制组:

systemd-cgls

我所做的是更改要处理的php-fpm服务的KillMode。 只需编辑它的.service文件:

vi /etc/systemd/system/multi-user.target.wants/php7.0-fpm.service

并将行更改或添加到[Service]块:

KillMode=process

然后执行以下命令重新加载配置:

systemctl daemon-reload

这对我有用。

参考文献: Can't detach child process when main process is started from systemd

http://man7.org/linux/man-pages/man5/systemd.kill.5.html

什么会很棒的命令(类似于setsid)允许启动进程并从控制组中分离但我无法找到它。