3

我在使用 CRON 运行 PHP 脚本的单个实例时遇到问题。也许有人可以帮助解释需要什么。目前,我有一个startup脚本被调用,crontab在调用 PHP 实例之前检查以确保 PHP 脚本的实例尚未运行。

crontab -e入口:

* * * * * /var/www/private/script.php >> /var/www/private/script.log 2>&1 &

。/启动

#!/bin/bash

if ps -ef | grep '[s]cript';
        then
                exit;
        else
                /usr/bin/php /var/www/private/script.php  >>/var/www/private/script.log 2>&1 &
                echo 'started'
fi

这似乎不起作用,我似乎无法记录任何错误以了解如何继续调试它。

4

2 回答 2

1

您可以为此使用 lockrun:http ://www.unixwiz.net/tools/lockrun.html

* * * * * /usr/local/bin/lockrun --lockfile=/var/run/script.lockrun -- php /home/script.php

或者使用 Perl:

system('php /home/script.php') if ( ! `ps -aef|grep -v grep|grep script.php`);
于 2012-10-15T19:54:32.433 回答
0

测试进程并不是防止脚本出现多个实例的最可靠方法。

bash,我建议你使用它:

if ( set -o noclobber; echo "locked" > "$lockfile") 2> /dev/null; then
  trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT
  echo "Locking succeeded" >&2
  rm -f "$lockfile"
else
  echo "Lock failed - exit" >&2
  exit 1
fi

此页面中还有另一个示例http://wiki.bash-hackers.org/howto/mutex

另一种解决方案(如果不使用NFS)是使用flock (1),请参阅如何使用 linuxflock 命令来防止另一个根进程删除文件?

于 2012-10-15T19:56:58.040 回答