Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查是否已在cron上运行php文件命令_Php_Process_Cron - Fatal编程技术网

检查是否已在cron上运行php文件命令

检查是否已在cron上运行php文件命令,php,process,cron,Php,Process,Cron,我有一个cron作业,每分钟执行一次。但我发现它运行了多次。我正在寻找一种方法来检查流程是否仍在运行,然后不要启动新流程,或者在启动新流程之前终止已经运行的流程。这里有很多变体来测试它。例如,您可以在任务正在进行时更新数据库,并且每次运行测试都会使用此标志。或者,您可以打开文件并将其保存。当脚本执行时-测试是否可以锁定此文件。或者,您可以读取进程列表,如果没有脚本,则继续执行 所以,主要目标是-createwhere标志,它将告诉您的脚本它已经在进行中。但是什么对你的具体情况更好呢?这是你的选择

我有一个cron作业,每分钟执行一次。但我发现它运行了多次。我正在寻找一种方法来检查流程是否仍在运行,然后不要启动新流程,或者在启动新流程之前终止已经运行的流程。

这里有很多变体来测试它。例如,您可以在任务正在进行时更新数据库,并且每次运行测试都会使用此标志。或者,您可以打开文件并将其保存。当脚本执行时-测试是否可以锁定此文件。或者,您可以读取进程列表,如果没有脚本,则继续执行

所以,主要目标是-createwhere标志,它将告诉您的脚本它已经在进行中。但是什么对你的具体情况更好呢?这是你的选择

更新 经过一些研究,发现了使用系统“flock”命令来做同样事情的良好变体。可能有用:

* * * * * 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";