PHP 在 php-fpm 重新启动后终止 exec() 后台进程

PHP kill exec() background process after php-fpm restarted

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

我的简码:

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

不幸的是,在 systemd 重启后 php7.1-fpm 程序被终止了。

我已经尝试 运行 与 运行 池中不同的用户:

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

然而,这并没有解决问题 - 仍然是致命的。

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

这似乎是由于 php-fpm servicesystemd 管理。

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

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

systemd-cgls

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

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

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

KillMode=process

然后通过执行重新加载配置:

systemctl daemon-reload

这对我有用。

参考资料:

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

如果有一个命令(类似于 setsid)允许启动一个进程并从控制组中分离出来,但我没能找到它,那就太棒了。