Python 3.x 在特定时间内每隔10秒运行一次bash脚本
我有一个脚本,每5秒运行一次,是否可以在CET 08:00-12:00之间运行该脚本 我以为我可以用cron作业来完成这项工作,但不幸的是,这至少需要1分钟。所以我想创建一个cron作业,在08:00启动脚本,然后在12:00终止它,我认为这是最好的解决方案 有人有什么意见吗Python 3.x 在特定时间内每隔10秒运行一次bash脚本,python-3.x,bash,shell,Python 3.x,Bash,Shell,我有一个脚本,每5秒运行一次,是否可以在CET 08:00-12:00之间运行该脚本 我以为我可以用cron作业来完成这项工作,但不幸的是,这至少需要1分钟。所以我想创建一个cron作业,在08:00启动脚本,然后在12:00终止它,我认为这是最好的解决方案 有人有什么意见吗 #!/bin/bash while true; do python3 script.py sleep 5; done 正如他的回答所指出的那样,这只涵盖了“运行脚本,等待10秒并重复,在8:00
#!/bin/bash
while true; do
python3 script.py
sleep 5;
done
正如他的回答所指出的那样,这只涵盖了“运行脚本,等待10秒并重复,在8:00和12:00之间”
我可以想到几种方法:
A.在cron中8:00启动脚本,并在完成时进行检查
#!/bin/sh
END=$(date -d "12:00" +"%H * 60 + %M" | bc)
while [ $(date +"%H * 60 + %M" | bc) -lt $END ]; do
date >> /tmp/log.txt # replace this with your script
sleep 10
done
说明:
计算一天开始后的分钟数注意:bc在这里用于处理前导零date+%H*60+%M”|bc
将出错$($(日期+%H*60+%M))
-与结束时间进行比较[$(日期+%H*60+%M”| bc)-lt$END]
#!/bin/bash
echo $$ > /tmp/pid.txt
EXIT=
trap "echo 'Exiting' >> /tmp/log.txt; EXIT=yes" TERM
while [[ -z "$EXIT" ]]; do
date >> /tmp/log.txt # replace this with your script
sleep 10
done
crontab如下所示:
00 08 * * * /path/to/wrappers/script.sh
00 12 * * * kill $(cat /tmp/pid.txt)
说明:
-保存pid(您可能应该选择 另一个位置,适合您的系统)echo$$$>/tmp/pid.txt
-这将运行trap“echo'Exiting'>/tmp/log.txt;EXIT=yes”术语
当一个术语 接收到信号(TERM是kill发送的默认信号)李>echo'Exiting'>/tmp/log.txt;退出=是
-退出为空时重复while[-z“$EXIT”];do
- 这样做的好处是可以在需要时优雅地关闭脚本,而不仅仅是在12:00李>
#!/bin/sh
END=$(date -d "12:00" +"%H * 60 + %M" | bc)
while [ $(date +"%H * 60 + %M" | bc) -lt $END ]; do
date >> /tmp/log.txt # replace this with your script
sleep 10
done
说明:
计算一天开始后的分钟数注意:bc在这里用于处理前导零date+%H*60+%M”|bc
将出错$($(日期+%H*60+%M))
-与结束时间进行比较[$(日期+%H*60+%M”| bc)-lt$END]
#!/bin/bash
echo $$ > /tmp/pid.txt
EXIT=
trap "echo 'Exiting' >> /tmp/log.txt; EXIT=yes" TERM
while [[ -z "$EXIT" ]]; do
date >> /tmp/log.txt # replace this with your script
sleep 10
done
crontab如下所示:
00 08 * * * /path/to/wrappers/script.sh
00 12 * * * kill $(cat /tmp/pid.txt)
说明:
-保存pid(您可能应该选择 另一个位置,适合您的系统)echo$$$>/tmp/pid.txt
-这将运行trap“echo'Exiting'>/tmp/log.txt;EXIT=yes”术语
当一个术语 接收到信号(TERM是kill发送的默认信号)李>echo'Exiting'>/tmp/log.txt;退出=是
-退出为空时重复while[-z“$EXIT”];do
- 这样做的好处是可以在需要时优雅地关闭脚本,而不仅仅是在12:00李>
另外:请参阅-它详细说明了如何通过SystemD运行此脚本,但即使前一个脚本没有结束,也会每10秒运行一次脚本(如果我正确理解了答案,我不熟悉SystemD)除了Sorin的解决方案之外
while true; do
do_something
sleep 10
done
这里作业dou\u something
不是每10秒(!)执行一次,而是每10秒加上执行dou\u something
所需的时间执行一次。因此,另一种选择是:
while true; do
sleep $((10-$(date +%s)%10))
do_something
done
在这里,每当秒数为0、10、20、30、40或50时,都会执行作业do\u something
。唯一的陷阱是:如果dou_something
运行模式超过10秒,则至少会跳过一次执行
我的睡眠说明:
DELAY=10
sleep $(( DELAY- $(date +%s) % DELAY))
$(…)
进入数学模式<代码>$(日期+%s)返回自纪元以来的总秒数%DELAY
是一种模运算,因此结果介于0和排除延迟之间(本例中为0..9)<代码>延迟-保证睡眠时间至少为1秒 除了索林溶液
while true; do
do_something
sleep 10
done
这里作业dou\u something
不是每10秒(!)执行一次,而是每10秒加上执行dou\u something
所需的时间执行一次。因此,另一种选择是:
while true; do
sleep $((10-$(date +%s)%10))
do_something
done
在这里,每当秒数为0、10、20、30、40或50时,都会执行作业do\u something
。唯一的陷阱是:如果dou_something
运行模式超过10秒,则至少会跳过一次执行
我的睡眠说明:
DELAY=10
sleep $(( DELAY- $(date +%s) % DELAY))
$(…)
进入数学模式<代码>$(日期+%s)返回自纪元以来的总秒数%DELAY
是一种模运算,因此结果介于0和排除延迟之间(本例中为0..9)<代码>延迟-保证睡眠时间至少为1秒 这回答了你的问题吗?这将在每次调用之前等待N秒,而每次调用将偏离真正的N秒周期。那么应该是N秒间隔还是每N秒间隔?我想,如果我正确理解了你的问题,N秒间隔无关紧要。运行脚本,等待5秒钟,然后再次运行。这就是我想要实现的:)这能回答你的问题吗?这将在每次调用之前等待N秒,而每次调用将偏离真正的N秒周期。那么应该是N秒间隔还是每N秒间隔?我想,如果我正确理解了你的问题,N秒间隔无关紧要。运行脚本,每天等待5秒