如何让任务每 a-b 分钟执行一次脚本

2020-09-15 14:17:36 +08:00
 xiaohantx

*/8 * * * * /bin/sh /www/wwwroot/xxxx.com/crontab.sh

目前是 8 分钟一次

rand_num=$(($RANDOM%300+60))

declare -i i=1;

while ((i<rand_num))
do
	sleep 1
	let i++
done

php /www/wwwroot/xxx.com/run.php

每 8 分钟把任务提出来一次然后再延迟 1-5 分钟,但是这样就会出现两个任务在跑的情况。。。想单任务但是时间在 a-b 间任意

3718 次点击
所在节点    Linux
34 条回复
TaxKiz
2020-09-15 14:35:30 +08:00
#!/bin/bash

export PATH='/bin:/sbin:/usr/bin:/usr/sbin'

while true; do

ps -ef | grep '/www/wwwroot/xxx.com/run.php' | grep -v '\bgrep\b' >/dev/null 2>&1

if [$? != 0]; then

rand_num=$(($RANDOM % 300 + 60))

declare -i i=1

while ((i < rand_num)); do
sleep 1
let i++
done

php /www/wwwroot/xxx.com/run.php

unset -v rand_num i

fi

done
xiaohantx
2020-09-15 14:37:16 +08:00
@TaxKiz crontab -e 里面的基础 8 分钟不变还是放在那是嘛
xiaohantx
2020-09-15 14:41:52 +08:00
@TaxKiz 好像丢服务器线程跑满了,CPU 变成了 100%。。。
TaxKiz
2020-09-15 14:48:19 +08:00
@xiaohantx 草率了,你加个 sleep

...
unset -v rand_num i

fi

sleep 1

done
TaxKiz
2020-09-15 14:48:50 +08:00
@xiaohantx sleep 时间自己定义
knightdf
2020-09-15 15:00:23 +08:00
```shell
*/a * * * * python -c 'import random; import time; time.sleep(random.randint(0, b-a) * 60)' && flock -x -n /www/wwwroot/xxx.com/run.php php /www/wwwroot/xxx.com/run.php
```
xiaohantx
2020-09-15 15:02:46 +08:00
@TaxKiz 不好意思不是很会 shell
日志报了个错
`/www/server/cron/d4e8c583cbd42140a85eac6baabec0f5: line 12: [1: command not found`

另外想问下我已经配置了定时任务,每 N (固定)分钟执行这个脚本,脚本里面的 sleep 是啥意思= =比如 1 分钟执行了这个 4 次然后随机时间还没到在后台定时这时候 sleep 是起到什么作用呢,不过感谢老哥
zlowly
2020-09-15 15:04:21 +08:00
1 、可以在脚本里保证单实例执行,大概方式就是
a)判断如果 lock 文件是否存在,如果存在则退出
b)touch lock
c)用 trap 在 exit 时候 rm lock
2 、这个需求其实还是不很明确,就是如果上一次还没执行完就到下一次的预定时间了该办?
3 、可以不用 crontab,用 atd 服务,然后脚本末尾用 at 指定下次执行时间。
xiaohantx
2020-09-15 15:09:30 +08:00
@knightdf 是要写进 crontab 嘛,我直接 shell 脚本跑返回了
```
/www/server/cron/d4e8c583cbd42140a85eac6baabec0f5: line 4: */1: No such file or directory
----------------------------------------------------------------------------
★[2020-09-15 15:08:19] Successful
----------------------------------------------------------------------------
```
knightdf
2020-09-15 15:10:54 +08:00
@xiaohantx 这是一条 cron 啊
TaxKiz
2020-09-15 15:15:10 +08:00
```sh
#!/bin/bash

export PATH='/bin:/sbin:/usr/bin:/usr/sbin'

# 替换成实际路径
P='/xxx/run.php'

while true; do

# 检测进程是否存在
ps -ef | grep $P | grep -v '\bgrep\b' >/dev/null 2>&1

# 如果进程不存在, 执行 PHP 脚本
if [ $? != '0' ]; then

rand_num=$(($RANDOM % 300 + 60))

declare -i i=1

while ((i < rand_num)); do
sleep 1
let i++
done

php $P

unset -v rand_num i

fi

# 每 1 秒检测一次进程, 可自定义
sleep 1

done
```

@xiaohantx
xiaohantx
2020-09-15 15:42:34 +08:00
@knightdf 我是应该运行 crontab -e 然后粘贴进去嘛,然后 service crond restart 是嘛
knightdf
2020-09-15 15:44:16 +08:00
@xiaohantx 参数做相应的更改后直接粘贴进去,不需要 restart
xiaohantx
2020-09-15 15:47:02 +08:00
@TaxKiz sleep 我暂时没改默认的 1,rand_num=$(($RANDOM % 480 + 180))改为 2-8 分钟,但是输出还是一分钟一次,对了我这里试着用了宝塔的定时任务,定时执行时间是 1 分钟一次,不知道有没有影响
xiaohantx
2020-09-15 15:56:50 +08:00
@knightdf
*/1 * * * * python -c 'import random; import time; time.sleep(random.randint(0, 2-1) * 60)' && flock -x -n /www/wwwroot/xxx.com/run.php php /www/wwwroot/xxx.com/run.php
粘贴进去了好像会同时运行两次?理解的是这个时间 1 分钟基础时间然后随机 1-2 分钟,就是最快应该 2 分钟以上吧 2-3 分钟?
xiaohantx
2020-09-15 15:57:48 +08:00
@knightdf 我注意到了,因为做的消息推送,每次发送,好像是发送完之后马上跟着再执行一次推送
knightdf
2020-09-15 16:15:40 +08:00
@xiaohantx 不可能同时运行 2 次,这是一分钟一次,延迟 0 或者 1 分钟
dier
2020-09-15 16:19:15 +08:00
declare -i s_number # 将变量声明为整数
s_number=`cat /dev/urandom | tr -dc 1-6 | head -c 1`*60 # 随机出 1-5 之间的数乘以 60,得到秒数
sleep $s_number # 睡眠指定秒数
wait # 等待上面的命令执行完,即睡眠指定秒数再往下执行

上面的放在你要执行的脚本前,触发定时任务后就会自动随机睡眠 1-5 分钟再执行
xiaohantx
2020-09-15 16:20:42 +08:00
@knightdf 那还是之前那个原因嘛,每 1 分钟一次,比如一个 a 任务 3 分钟,b 任务 2 分钟,那第一个还没到时间 b 先执行了,然后 a 又执行了,但是这样应该也间隔一分钟吧.....有点懵,基础时间可以去掉嘛,只想给个区间时间,然后随机在这个区间进行执行任务
treblex
2020-09-15 17:02:22 +08:00
装个宝塔,或者 php 可以访问的话 直接用 url 监控

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/707182

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX