检查是否已在cron上运行php文件命令
我有一个cron作业,每分钟执行一次。但我发现它运行了多次。我正在寻找一种方法来检查流程是否仍在运行,然后不要启动新流程,或者在启动新流程之前终止已经运行的流程。这里有很多变体来测试它。例如,您可以在任务正在进行时更新数据库,并且每次运行测试都会使用此标志。或者,您可以打开文件并将其保存。当脚本执行时-测试是否可以锁定此文件。或者,您可以读取进程列表,如果没有脚本,则继续执行 所以,主要目标是-createwhere标志,它将告诉您的脚本它已经在进行中。但是什么对你的具体情况更好呢?这是你的选择 更新 经过一些研究,发现了使用系统“flock”命令来做同样事情的良好变体。可能有用:检查是否已在cron上运行php文件命令,php,process,cron,Php,Process,Cron,我有一个cron作业,每分钟执行一次。但我发现它运行了多次。我正在寻找一种方法来检查流程是否仍在运行,然后不要启动新流程,或者在启动新流程之前终止已经运行的流程。这里有很多变体来测试它。例如,您可以在任务正在进行时更新数据库,并且每次运行测试都会使用此标志。或者,您可以打开文件并将其保存。当脚本执行时-测试是否可以锁定此文件。或者,您可以读取进程列表,如果没有脚本,则继续执行 所以,主要目标是-createwhere标志,它将告诉您的脚本它已经在进行中。但是什么对你的具体情况更好呢?这是你的选择
* * * * * flock -n /some/lockfile command_to_run_every_minute
如果您想要php解决方案,最简单的方法是创建一个锁文件,每次执行脚本时,检查文件是否存在,然后退出脚本,如果不存在,则让脚本结束。但我认为最好在cron指令中使用flock;)
所有锁定机制(包括flock和lock文件)-请注意,如果出现问题,您的cron作业将永远不会自动运行:
- flock:如果服务器崩溃(有时会发生这种情况),您将在命令上拥有永久锁定(直到手动删除)
- 锁定文件:如果命令失败并出现致命错误,您的文件将不会被删除,因此cron作业将无法启动(当然,您可以使用错误处理程序,这无论如何都不会使您避免因内存限制或服务器重置而出现故障)
所以,我认为运行系统“ps aux”是最好的解决方案。当然,这只适用于基于Linux的系统(和MacOS)。这可能是解决问题的好办法。请注意,“grep-vgrep”是筛选shell_exec中特定查询所必需的
#!/usr/bin/php -f
<?php
$result = shell_exec("ps aux | grep -v grep | grep ". basename(__FILE__) );
echo strlen($result) ? "running" : "not running";
#/usr/bin/php-f
签入服务器进程列表。签出并尝试使用简单的文件锁flock
查看此帮助,谢谢。这给了我想要的。虽然我不得不增加$lifelimit,因为我的脚本可能需要更长的时间才能一次完成。太好了!:)是的,您可以自定义以获得您想要的内容=)我是否应该在cron作业的命令行中添加此内容?@Toni完全正确,将其添加到cronjobs。只需将“/some/lockfile”和“command\u to\u run\u every\u minute”替换为您的路径和命令。
#!/usr/bin/php -f
<?php
$result = shell_exec("ps aux | grep -v grep | grep ". basename(__FILE__) );
echo strlen($result) ? "running" : "not running";