我使用的是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()。我该如何解决这个问题?
答案 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
)允许启动进程并从控制组中分离但我无法找到它。