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
答案 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'的完整路径。但是,正如其他用户所说,你的脚本每分钟都会生成一个脚本副本,这可能不是你所期望的。