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

每5秒执行一次php文件的Bash脚本,bash,shell,sh,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

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

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

#!/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

中添加一行,您错过了将进程置于后台的
&
字符:

#!/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规则将每分钟执行一次脚本。每个脚本将继续运行一个无限循环。因此,最终将有许多过程

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

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

$ flock --version
flock (util-linux 2.20.1)
让你的亲信如此:

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

cron规则将每分钟执行一次脚本。每个脚本将继续运行一个无限循环。因此,最终将有许多过程

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

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

$ flock --version
flock (util-linux 2.20.1)
让你的亲信如此:

# m h  dom mon dow   command
* * * * * flock -n /tmp/test.lock /home/user/public_html/website.com/test.sh
要使cron作业工作(可执行),请执行以下操作

要使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作业工作(可执行),请执行以下操作

要使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通常不像用户那样具有相同的路径变量


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

问题在于cron通常没有与您的用户相同的路径变量


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

另一种解决方法是只运行脚本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
--或--

--更新--

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


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

另一种解决方法是只运行脚本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
--或--

--更新--

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


说明:此脚本调用test.php,并等待它终止(因为它最后没有
&
)。然后它测量时间:如果已经过了5秒,它会立即调用test.php。否则,它将休眠剩余的时间,以便在上一次测试开始后的5秒内调用next test.php

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

步骤2=>创建autocron.sh文件后->将此代码放入autocron.sh文件
中,为true;开始日期+%s
;php executablefile.php;结束=
date+%s
;如果[$($end-$begin))-lt 5];然后睡眠$($begin+5-$end));fi;完成
->示例可执行PHP文件名和.sh文件应相同

步骤3=>然后保存autocron.sh文件

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

第5步=>并授予PHP文件->
chmod+x PHP文件位置(executablefile.PHP)的权限


步骤5=>此命令将在后台进程中运行.sh文件,即使终端已关闭->
nohup sh autocron.sh&
下面的代码我使用过linux¢ os服务器,它为我工作

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

步骤2=>创建autocron.sh文件后->将此代码放入autocron.sh文件
中,为true;开始日期+%s
;php executablefile.php;结束=
date+%s
;如果[$($end-$begin))-lt 5];然后