我的问题之前好像有人问过,但是等等,这个有点不同。
我有 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 确实在运行?
答案 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 的身份使用主管。