每5秒执行一次php文件的Bash脚本

时间:2014-11-17 23:27:22

标签: bash shell sh

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,这会创建多个proccesses,如:

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

6 个答案:

答案 0 :(得分:2)

该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

答案 1 :(得分:2)

在代码下面我使用了linux& cent os服务器为我工作

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

步骤2 =>创建autocron.sh文件后 - >将此代码放在autocron.sh文件中while true; do begin=日期+%s ; php executablefile.php; end=日期+%s ; if [ $(($end - $begin)) -lt 5 ]; then sleep $(($begin + 5 - $end)); fi; done - >示例可删除的PHP文件名和& .sh文件shouble是一样的。

步骤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&

答案 2 :(得分:1)

另一个答案是仅运行脚本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

答案 3 :(得分:0)

您错过了将&字符置于后台的#!/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,则另一种可能性是在{{1}}

中添加一行

答案 4 :(得分:0)

使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

答案 5 :(得分:0)

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

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