我有一个PHP
在队列上侦听的脚本。从理论上讲,它永远不会死。有什么东西可以检查它是否还在运行?Ruby's God ( http://god.rubyforge.org/ )
类似的东西PHP
?
上帝是语言不可知论者,但如果有一个适用于 Windows 的解决方案,那就太好了。
我有一个PHP
在队列上侦听的脚本。从理论上讲,它永远不会死。有什么东西可以检查它是否还在运行?Ruby's God ( http://god.rubyforge.org/ )
类似的东西PHP
?
上帝是语言不可知论者,但如果有一个适用于 Windows 的解决方案,那就太好了。
我有同样的问题 - 想检查脚本是否正在运行。所以我想出了这个,并将它作为一个 cron 作业运行。它将正在运行的进程作为一个数组抓取并循环遍历每一行并检查文件名。似乎工作正常。将 #user# 替换为您的脚本用户。
exec("ps -U #user# -u #user# u", $output, $result);
foreach ($output AS $line) if(strpos($line, "test.php")) echo "found";
在linux中运行ps如下:
ps -C php -f
然后,您可以在 php 脚本中执行以下操作:
$output = shell_exec('ps -C php -f');
if (strpos($output, "php my_script.php")===false) {
shell_exec('php my_script.php > /dev/null 2>&1 &');
}
上面的代码列出了所有完整运行的php进程,然后检查“my_script.php”是否在正在运行的进程列表中,如果没有,则运行该进程并且不等待进程终止继续执行它正在做。
Just append a second command after the script. When/if it stops, the second command is invoked. Eg.:
php daemon.php 2>&1 | mail -s "Daemon stopped" you@example.org
Technically, this invokes the mailer right away, but only completes the command when the php script ends. Doing this captures the output of the php-script and includes in the mail body, which can be useful for debugging what caused the script to halt.
简单的 bash 脚本
#!/bin/bash
while [true]; do
if ! pidof -x script.php;
then
php script.php &
fi
done
不适用于窗户,但...
我有几个长时间运行的 PHP 脚本,它们有一个包装它的 shell 脚本。您可以选择从脚本中返回一个值,该值将在 shell 脚本中检查以退出、立即重新启动或休眠几秒钟 - 然后重新启动。
这是一个简单的脚本,它一直运行 PHP 脚本,直到它被手动停止。
#!/bin/bash 清除 日期 php -f cli-SCRIPT.php echo "请稍等..."; 睡觉 10 执行 $0
“exec $0”重新启动脚本,而不创建稍后必须解开的子进程(同时占用资源)。这个 bash 脚本包装了一个邮件发件人,所以如果它退出并暂停片刻也不是问题。
这是我为解决类似问题所做的工作。如果其他人有一个参数化的 php 脚本,您希望 cron 经常执行,但只希望在任何时候运行一个执行,这会有所帮助。将此添加到您的 php 脚本的顶部,或创建一个通用方法。
$runningScripts = shell_exec('ps -ef |grep '.strtolower($parameter).' |grep '.dirname(__FILE__).' |grep '.basename(__FILE__).' |grep -v grep |wc -l');
if($runningScripts > 1){
die();
}
你可以在你的 crontab 中这样写:
0 3 * * * /usr/bin/php -f /home/test/test.php my_special_cron
您的 test.php 文件应如下所示:
<?php
php_sapi_name() == 'cli' || exit;
if($argv[1]) {
substr_count(shell_exec('ps -ax'), $argv[1]) < 3 || exit;
}
// your code here
这样一来,您将只有一个带有my-special-cron
进程密钥的 cron 作业的活动实例。因此,您可以在同一个 php 文件中添加更多作业。
test.php system_send_emails sendEmails
test.php system_create_orders orderExport
受到 Justin Levene 的回答的启发,并对其进行了改进,因为ps -C
它在 Mac 中不起作用,这在我的情况下是我需要的。所以你可以在 php 脚本中使用它(也许就在你需要守护进程之前),在 Mac OS X 10.11.4 和 Ubuntu 14.04 中测试:
$daemonPath = "FULL_PATH_TO_DAEMON";
$runningPhpProcessesOfDaemon = (int) shell_exec("ps aux | grep -c '[p]hp ".$daemonPath."'");
if ($runningPhpProcessesOfDaemon === 0) {
shell_exec('php ' . $daemonPath . ' > /dev/null 2>&1 &');
}
小而有用的细节:为什么grep -c '[p]hp ...'
而不是grep -c 'php ...'
?
因为在计算过程grep -c 'php ...'
时,将被视为符合我们模式的过程。因此,对 php 的第一个字母使用正则表达式会使我们的命令与我们搜索的模式不同。
如果您掌握了脚本,您可以要求他在 db 中每 X 次设置一个时间值,然后让 cron 作业检查该值是否是最新的。
troelskn 写道:
只需在脚本后附加第二个命令。当/如果它停止,则调用第二个命令。例如。:
php daemon.php | mail -s "Daemon stopped" you@example.org
mail
每次在 daemon.php 中打印一行时都会调用它(应该永远不会,但仍然如此。)
相反,使用双 & 运算符来分隔命令,即
php daemon.php & mail -s "Daemon stopped" you@example.org
一种可能的解决方案是让它使用套接字函数在端口上侦听。您可以使用简单的脚本检查套接字是否仍在侦听。甚至像 pingdom 这样的监控服务也可以监控它的状态。如果它死了,则套接字不再侦听。
很多解决方案..祝你好运。
如果您无法直接检查 PHP 脚本,您可以制作一个简单的包装器并检查它。我对 Windows 脚本编写不够熟悉,无法在这里说明它是如何完成的,但是在 Bash 中,它看起来像......
wrapper_for_test_php.sh
#!/bin/bash
php test.php
然后,您只需像检查任何其他 bash 脚本一样检查包装器: pidof -x wrapper_for_test_php.sh
我已经在 windows 上使用了 cmder,并且基于这个脚本,我想出了这个我后来设法在 linux 上部署的脚本。
#!/bin/bash
clear
date
while true
do
php -f processEmails.php
echo "wait a little while for 5 secobds...";
sleep 5
done