【问题标题】:Bash script that executes php file every 5 seconds每 5 秒执行一次 php 文件的 Bash 脚本
【发布时间】:2015-01-09 13:27:25
【问题描述】:

Bash 脚本:

$ cat test.sh
#!/bin/bash
while true
do
 /home/user/public_html/website.com/test.php
 sleep 5
done

我试图用 cron 调用它:

* * * * * /home/user/public_html/website.com/test.sh

我的错误在哪里? .sh 的位置是否重要?

编辑: 我从上面解决了所有问题。我还创建了这个 cron 作业来防止多个进程:

* * * * * flock -n /tmp/test.lock /home/user/public_html/website.com/test.sh

现在的问题是 bash 每 5 秒执行一次 php,这会创建多个进程,例如:

user 12:31 /home/user/public_html/website.com/test.php
user 12:31 /home/user/public_html/website.com/test.php
user 12:31 /home/user/public_html/website.com/test.php

如何控制?我需要更改 bash 脚本,以便它可以检测 PHP 是否正在执行。

这是否正确:

#!/bin/bash
while true
if [ "$(pidof test.php)" ]
then
echo "Running"
else
do
 /home/user/public_html/website.com/test.php &
 sleep 5
fi
done

【问题讨论】:

  • 脚本是否有模式+x 用户cron 将执行它?
  • 我对这个 .sh 脚本一无所知。我只需要在后台每 5 秒执行一次 php 文件。对不起,我不知道 +x 是什么。如果有影响,我会使用共享主机。
  • 请澄清您的问题。 “我的错在哪里?”方法 ...? php 是否正在运行?你能测试一个更简单的脚本来确保它可以工作吗,比如echo > mylogfile.log
  • 我们只知道至少一个问题:您的脚本在第一分钟每 5 秒运行一个 test.php,但在第二分钟每 5 秒运行两个 test.php,3 在第 3 分钟,... 等等。
  • 能否请您检查我在主要问题中的编辑。谢谢!

标签: bash shell sh


【解决方案1】:

该 cron 规则将每分钟执行一次您的脚本。并且每个脚本将继续运行一个无限循环。所以你最终会得到很多进程..

不幸的是,cron 不允许比分钟更精细的粒度,因此您可以保持原样,但添加一些锁定。在启动新脚本之前,锁定它会检查脚本是否尚未运行。

如果你安装了“flock”,你可以使用类似的东西,

$ flock --version
flock (util-linux 2.20.1)

让你的 cron 如此:

# m h  dom mon dow   command
* * * * * flock -n /tmp/test.lock /home/user/public_html/website.com/test.sh

【讨论】:

  • 这是一个优雅的解决方案。
  • 我在一个共享主机上,它没有 Flock,但我会找到类似的东西。我只想让脚本先工作:/
  • 现在发生的事情是 bash 仅在 cron 调用它时才起作用 - 仅一次,不像循环。它只执行一次php。不是每 10 秒一次。
  • 我打电话给我的托管服务提供商,他们说我们已经安装了flock。这是正确的 cron 工作吗:flock -n /tmp/test.lock /home/user/public_html/website.com/test.sh 也许每 10 分钟一次可以吗?
【解决方案2】:

下面的代码我使用了 linux 和 cent os 服务器,它为我工作

步骤 1 => 在此路径 /usr/bin 中创建 autocron.sh 文件 -> vim autocron.sh

步骤 2 => 创建 autocron.sh 文件后 -> 将此代码放入 autocron.sh 文件 while true; do begin=date +%s; php executablefile.php; end=date +%s; if [ $(($end - $begin)) -lt 5 ]; then sleep $(($begin + 5 - $end)); fi; done -> 示例可执行 PHP 文件名和 .sh文件应该是一样的。

第 3 步 => 之后保存 autocron.sh 文件

第 4 步 => 授予 autocron.sh 文件的权限 -> chmod +x autocron.sh

第 5 步 => 并赋予 PHP 文件的权限 -> chmod +x PHP file location (executablefile.php)

第 5 步 => 即使终端已关闭,此命令也会在后台进程中运行 .sh 文件 -> nohup sh autocron.sh&

【讨论】:

    【解决方案3】:

    另一种答案是只运行你的脚本 12 次,然后把它放在 crontab 中

    #!/bin/bash
    for loop in 1 2 3 4 5 6 7 8 9 0 1 2; do
      /home/user/public_html/website.com/test.php &
      sleep 5
    done
    

    -- 或者--

    #!/bin/bash
    loop=0
    while [ $loop -lt 12 ]; do
      /home/user/public_html/website.com/test.php &
      sleep 5
      loop=$(($loop+1))
    done
    

    --更新--

    如果您的目标是不超过一个 test.php,请使用此脚本:(只运行一次,不要将其放在 crontab 中):

    #!/bin/bash
    
    while true; do
        begin=`date +%s`
        /home/user/public_html/website.com/test.php
        end=`date +%s`
        if [ $(($end - $begin)) -lt 5 ]; then
            sleep $(($begin + 5 - $end))
        fi
    done
    

    解释:这个脚本调用test.php,并等待它终止(因为它最后没有&)。然后它测量时间:如果已经过了 5 秒,它会立即调用 test.php。否则,它将休眠剩余的时间,以便从上一个 test.php 开始的接下来的 5 秒内调用下一个 test.php

    【讨论】:

    • 第一个看起来很笨,但我更喜欢它,因为它更短(甚至更少的字符数)。而且它运行得更快(一点点)。
    • 谢谢,但现在的问题是 PHP 脚本被调用太频繁,它创建了多个进程,如user 12:31 /home/user/public_html/website.com/test.php user 12:31 /home/user/public_html/website.com/test.php user 12:31 /home/user/public_html/website.com/test.php 如何检测 test.php 目前是否正在执行?我需要更改 bash。
    • 这就是我的答案在那里的原因。从安装 cron 脚本开始几分钟后,您的原始脚本会创建许多进程(直接在您的问题下查看我的评论)。此脚本加上您的 cron 脚本,每 5 秒创建一个进程 (test.php)。问题是,您的 test.php 将运行多长时间?例如,如果您的 test.php 平均在 10 秒内完成,则您可以预期 test.php 的 2 个进程随时同时执行。
    • 首先,让我们定义# of processes to fork in your script(在我上面的例子中,12,即1 2 3 ... 0 1 2)为N,脚本中休眠的时间为S,你可以看到在我的示例中,N x S = 60,恰好在 60 秒内,脚本均匀地运行 .php 12 次(每 5 秒)。现在,要降低频率,您可以延长睡眠时间 S,但保持 S x N 相同,即 60。
    • 也许使用nohup 命令?例如:nohup myscript.sh & 它将在后台运行,终端分离。
    【解决方案4】:

    为了让 cron 作业正常工作(可执行)做一个

    $ chmod +x /home/user/public_html/website.com/test.sh
    

    让 bash 脚本调用 php

    $ chmod +x /home/user/public_html/website.com/test.php
    

    最后你的 php 文件应该有一个 shebang 复制粘贴此代码到 php 文件的顶部

    #!/usr/bin/php
    

    或者没有shebang你需要改变你的shell脚本调用

    php /home/user/public_html/website.com/test.php
    

    【讨论】:

    • cron 看起来像:* * * * * $chmod +x /home/user/public_html/website.com/test.sh bash 看起来像:#!/bin/bash while true do $ chmod +x /home/user/public_html/website.com/test.php & sleep 5 done 我对此进行了测试,并收到了来自 cron 作业的电子邮件:/usr/local/cpanel/bin/jailshell: $: command not found
    • chmod +x 是您在 shell 中键入的命令,它将文件的属性更改为可执行文件。仅当您可以使用 ssh 或 telnet 连接时,这才有可能。另一种更改可执行标志的方法是使用像filezilla这样的ftp客户端,ftp-connect到您的服务器右键单击文件并更改可执行属性...“chmod +x”不能作为文本出现在您的任何文件中跨度>
    • 我只看到权限。它说每个人都可以执行它。
    • 你的意思是这必须在我的 bash 脚本中吗? php /home/user/public_html/website.com/test.php
    • 好的,一个问题解决了。然后将 cron-job 更改为 @reboot /path/to/script.sh 或如上所述使用flock 命令
    【解决方案5】:

    问题是 cron 通常没有与您的用户相同的 PATH 变量。

    您应该使用睡眠二进制文件“/bin/sleep”的完整路径。但是,正如其他用户所指出的,您的脚本将每分钟生成一个脚本副本,这可能不是您所期望的。

    【讨论】:

      【解决方案6】:

      您错过了将进程置于后台的& 字符:

      #!/bin/bash
      while true
      do
       /home/user/public_html/website.com/test.php &
       sleep 5
      done
      

      确保您的脚本是可执行的:

      chmod +x /home/user/public_html/website.com/test.php
      

      但是要结合cron 和这个脚本,有一种方法:

      @reboot /path/to/script.sh
      

      因为您只需要一个脚本实例。

      如果你cron不支持@reboot,另一种可能是在/etc/rc.local中添加一行

      【讨论】:

      • 我知道我可能无法将它们组合起来,但是如何在没有 cron 的情况下执行脚本呢?这个过程会在某个时候停止吗?
      • 这是一个无限循环,所以它就像一个守护进程,它在计算机开启时运行。您可以输入 crontab : @reboot /path/to/script.sh 自动启动脚本
      • 我用你的例子创建了一个 cron。没有效果,但错误可能出在脚本或其设置的某个地方。不知道如何使它可执行。
      • 你必须弄清楚你的cron版本是否支持@reboot
      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 2018-03-06
      • 2021-06-27
      相关资源
      最近更新 更多