PHP fpm重新启动后的PHP kill exec()后台进程

PHP fpm重新启动后的PHP kill exec()后台进程,php,linux,nginx,exec,background-process,Php,Linux,Nginx,Exec,Background Process,我使用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&g

我使用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\U连接。如何解决这个问题?

这似乎是由于systemd管理php fpm服务造成的

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

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

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

vi /etc/systemd/system/multi-user.target.wants/php7.0-fpm.service
并将该行更改或添加到[Service]块:

KillMode=process
然后通过执行以下命令重新加载配置:

systemctl daemon-reload
这对我很管用

参考资料:


最好是一个类似于setsid的命令,它允许启动一个进程并从控制组中分离,但我找不到它。

您希望该进程在系统重新启动后继续运行吗?请尝试exec'/usr/bin/nohup/usr/local/bin/program>/dev/null 2>&1'@塔鲁拉尔瓦尼:它不起作用php fpm重启后,进程被终止。我认为systemd将在服务器重启时收获子进程。所以我不确定你是否真的能逃脱that@rtfm否,仅在php fpm重新启动后。