Python 3.x 在特定时间内每隔10秒运行一次bash脚本

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

我有一个脚本,每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和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
说明:

  • date+%H*60+%M”|bc
    计算一天开始后的分钟数注意:bc在这里用于处理前导零
    $($(日期+%H*60+%M))
    将出错
  • [$(日期+%H*60+%M”| bc)-lt$END]
    -与结束时间进行比较
B.从cron开始,使用信号处理程序处理优雅的退出,使用cron结束退出

#!/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)
说明:

  • echo$$$>/tmp/pid.txt
    -保存pid(您可能应该选择 另一个位置,适合您的系统)
  • trap“echo'Exiting'>/tmp/log.txt;EXIT=yes”术语
    -这将运行
    echo'Exiting'>/tmp/log.txt;退出=是
    当一个术语 接收到信号(TERM是kill发送的默认信号)
  • while[-z“$EXIT”];do
    -退出为空时重复
  • 这样做的好处是可以在需要时优雅地关闭脚本,而不仅仅是在12:00
注意:两者结合可能是最好的方法

同样:请参阅-它详细说明了如何通过SystemD运行此脚本,但即使上一个脚本没有结束,也会每10秒运行一次脚本(如果我正确理解了答案,我不熟悉SystemD)

正如他的回答所指出的,仅包括“运行脚本,等待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
说明:

  • date+%H*60+%M”|bc
    计算一天开始后的分钟数注意:bc在这里用于处理前导零
    $($(日期+%H*60+%M))
    将出错
  • [$(日期+%H*60+%M”| bc)-lt$END]
    -与结束时间进行比较
B.从cron开始,使用信号处理程序处理优雅的退出,使用cron结束退出

#!/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)
说明:

  • echo$$$>/tmp/pid.txt
    -保存pid(您可能应该选择 另一个位置,适合您的系统)
  • trap“echo'Exiting'>/tmp/log.txt;EXIT=yes”术语
    -这将运行
    echo'Exiting'>/tmp/log.txt;退出=是
    当一个术语 接收到信号(TERM是kill发送的默认信号)
  • 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秒