Ealier我在一个单独的文件中使用了函数,可以通过脚本调用cron。
function processExists($file = false) {
$exists = false;
$file = $file ? $file : basename(__FILE__);
$command = "ps -ef | grep -v grep | grep $file";
exec($command, $pids);
if (count($pids) > 1) {
$exists = true;
}
return $exists;
}
它可以从任何PHP脚本执行:
if (processExists(basename(__FILE__))) {
echo 'Process in already running ';
exit(0);
}
由于某种原因,它在Debian6中不起作用。 现在我在每个脚本的开头添加:
$fh = fopen(__FILE__, 'r');
if (!flock($fh, LOCK_EX | LOCK_NB)) {
echo 'Script is already running!!!' . "\n";
exit(0);
}
它导致我尝试在单独的文件中创建函数的每个脚本中的代码重复,以便在需要时从任何PHP脚本调用,例如:
function stopIfRunning($file)
{
$fh = fopen($file, 'r');
if(!flock($fh, LOCK_EX | LOCK_NB)) {
echo 'Script is already running!!!' . "\n";
exit(0);
}
}
从php脚本调用:
stopIfRunning(__FILE__);
但在这种情况下它不起作用。你能解释为什么它在这种情况下不起作用吗?
答案 0 :(得分:1)
如果您需要确保服务正在运行,请使用Daemontools或Monit。
就个人而言,如果需要自定义实现,我会使用普通的Bash,而不是PHP。
顺便说一句,您可以在终端中轻松调试ps
命令。
答案 1 :(得分:0)
FILE 它是正在运行的文件的名称。
stopIfRunning(__FILE__);
function stopIfRunning($file)
{
$fh = fopen($file, 'r');
....
}
在这里,您尝试打开此执行文件以进行锁定。
答案 2 :(得分:0)
似乎问题是在stopIfRunning函数上使用$ fh。如果带有functiona的文件改为:
$fh = null;
function stopIfRunning($file)
{
global $fh;
echo $file, "\n";
$fh = fopen($file, 'r');
if (!$fh) {
echo 'Failed to open file', "\n";
}
if(!flock($fh, LOCK_EX | LOCK_NB)) {
echo 'Script is already running!!!' . "\n";
exit(0);
}
}
并在应该使用cron启动的文件中调用它:
stopIfRunning(__FILE__);
这里使用了全局变量,这并不好。如果有人提出没有全局变量的解决方案,那将会很棒。