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 service
由 systemd
管理。
从 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
)允许启动一个进程并从控制组中分离出来,但我没能找到它,那就太棒了。
我使用 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 service
由 systemd
管理。
从 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
)允许启动一个进程并从控制组中分离出来,但我没能找到它,那就太棒了。