如何永远在后台运行PHP脚本文件

时间:2021-05-15 23:09:16

标签: php

我的问题之前好像有人问过,但是等等,这个有点不同。

我有 2 个 php 文件,我运行以下命令:

nohup php file_1.php >/dev/null 2>&1 &
nohup php file_2.php >/dev/null 2>&1 &

这将创建基本上 2 个 php 进程。

我的问题是有时一个文件甚至两个文件都因未知原因被服务器杀死,我必须重新输入命令。我试过“永远”但没有用。

如果服务器重新启动,我将不得不输入这 2 个命令,我想到了 Cronjob,但我不确定它是否会启动它两次,这会造成更多混乱。

我的问题是,如果文件中的一个或两个被杀死,如何自动启动文件?实现此目的的最佳方法是检查 file_1.php 或 file_2.php 确实在运行?

2 个答案:

答案 0 :(得分:4)

有几种方法可以做到这一点。正如@Chris Haas 在评论中提到的,supervisord 可以为您执行此操作,或者您可以定期从 cron 运行看门狗 shell 脚本,以检查您的脚本是否正在运行,如果没有,请启动它。这是我使用的一个。

#!/bin/bash
FIND_PROC=`ps -ef |grep "php queue_agent.php --env prod" | awk '{if ($8 !~ /grep/) print $2}'`
# if FIND_PROC is empty, the process has died; restart it

if [ -z "${FIND_PROC}" ]; then
      DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
      echo queue_agent.php failed at `date`
      cd  ${DIR}
      nohup nice -n 10 php queue_agent.php --env prod -v > ../../sandbox/logs/queue_agent.log &
fi

exit 0

答案 1 :(得分:1)

我想你可以尝试找出为什么这两个 php 脚本作为第一步关闭。为了解决这个问题,你可以使用这个php函数:

void register_shutdown_function(callback $callback[.mixed $parameter]);

which 注册要在脚本执行完成或调用 exit() 后执行的回调。因此,当 php 文件像这样关闭时,您可以记录一些信息:

function myLogFunction() {
    //log some info here
}
register_shutdown_function(myLogFunction);

不是将标准输出和错误输出放入/dev/null,您可以将它们放入日志文件(因为也许我们可以从输出中获得一些有用的信息)。所以不要使用:

nohup php file_1.php >/dev/null 2>&1 &
nohup php file_2.php >/dev/null 2>&1 &

试试:

nohup php file_1.php 2>yourLog.log &
nohup php file_2.php 2>yourLog.log &

如果您想在启动服务器时自动运行这两个 php 文件,请尝试编辑 /etc/rc.local(当操作系统启动时自动运行)。在此文件中添加您的 php cli 命令行。

如果您不知道为什么 php 线程被关闭,请尝试以 @Chris Haas 的身份使用主管。