【问题标题】:PHP kill exec() background process after php-fpm restartedphp-fpm 重启后 PHP kill exec() 后台进程
【发布时间】:2023-03-27 21:32:02
【问题描述】:

我使用 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()。我该如何解决这个问题?

【问题讨论】:

  • 您希望该进程在系统重新启动后仍然存在?
  • 试试exec('/usr/bin/nohup /usr/local/bin/program &gt; /dev/null 2&gt;&amp;1');
  • @TarunLalwani 它不起作用。 :( php-fpm 重启后进程被杀死。
  • 我认为 systemd 将在服务器重新启动时获得子进程。所以不确定你是否真的能逃脱它
  • @rtfm 否,仅在 php-fpm 重启后。

标签: php linux nginx exec background-process


【解决方案1】:

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

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)可以启动一个进程并从控制组中分离出来,但我找不到它,那就太好了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多