【问题标题】:Run PHP Script via cronjob and avoid duplicate PHP process (flock)通过 cronjob 运行 PHP 脚本,避免重复的 PHP 进程(flock)
【发布时间】:2020-08-28 02:23:36
【问题描述】:

我一直在阅读有关如何运行 cronjob 并避免重复执行 cronjob 的信息。意思是,如果 cronjob 已经在运行,不要运行它的另一个实例。如果 cronjob 没有运行,请根据 cronjob 计划再次开始运行该进程。

flock() 是这样做的解决方案,正如这里所说:https://stackoverflow.com/a/33416116 使用flock 设置cronjob 的方法如下:

* * * * * flock -n /tmp/script.lockfile /usr/local/bin/script

但是,当我尝试使用flock 在cronjob 中设置我的PHP 脚本时,它不起作用。我设置如下:

*/10 * * * * flock -n /tmp/my-script.lockfile cd /var/www/html/wp-content/plugins/my-plugin/; php my-script.php

我尝试直接在控制台中测试它,不使用 cronjob,虽然它创建了 my-script.lockfile 文件,但它不运行 my-script.php 脚本。错误说:

flock: 执行失败 cd: 没有那个文件或目录 无法打开输入文件:my-script.php

我在这里缺少什么吗? flock() 是否仅适用于 .sh 脚本?如果是这样,我如何调整我的 PHP 脚本以使用 flock()

【问题讨论】:

  • 你试过把你的命令放在" 吗?喜欢flock -n /tmp/my-cript.lockfile "php /path/to/script.php"
  • 实际上,单独运行这个命令:php /var/www/html/wp-content/plugins/my-plugin/my-script.php 它什么也没做。我运行PHP脚本的方式如下:cd /var/www/html/wp-content/plugins/my-plugin/; php my-script.php - 但是当我尝试将它与flock和引号结合起来时,它会说:flock:执行失败......没有这样的文件或目录 - 我已经修改了一点主帖,这样就更清楚了。

标签: php cron flock


【解决方案1】:

看起来如果你想使用更复杂的命令,你必须在它前面加上 -c 并用 " 换行。

*/10 * * * * flock -n /tmp/my-script.lockfile -c "cd /var/www/html/wp-content/plugins/my-plugin/; php my-script.php"

【讨论】:

  • 好的,这确实有效,使用 -c 参数和 PHP 命令之间的引号。我注意到当脚本通过 crontab 启动时,它“触发”了 4 个进程:php my-script.php/bin/sh -c flock -n /tmp/my-script.lockfile -c "cd /var/www/html/wp-content/plugins/my-plugin/; php my-script.php"flock -n /tmp/my-script.lockfile -c cd /var/www/html/wp-content/plugins/my-plugin/; php my-script.php/bin/sh -c cd /var/www/html/wp-content/plugins/my-plugin/; php my-script.php这是“预期”行为吗?
  • 我不确定... Linux 命令不完全是我的专长,所以我只是试图让你的命令运行。这只是我的猜测,但我认为这可能是预期的行为。第一个进程是/bin/sh,cron 使用它来执行命令。然后是您的flock 命令本身,然后是flock 用来执行您的命令的/bin/sh,然后是php my-script.php 命令本身。
猜你喜欢
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 2010-12-23
  • 2021-06-04
  • 2011-07-27
相关资源
最近更新 更多