我有crontab运行的脚本,我希望每天执行4次代码的一部分。
我有一段代码
from datetime import datetime, time
now = datetime.now()
now_time = now.time()
if now_time == time(10,00) or now_time == time(16,00) or now_time == time(22,00) or now_time == time (4,00):
func()
这个解决方案的减号是这部分代码可以在10.01,10.02上执行,并且会以这种方式跳过。
是否有更温和,更短的方式来记下这部分代码?
谢谢!
答案 0 :(得分:1)
你可以做的是修改你的脚本以接受一个(额外的)参数,该参数将触发代码的特定部分的执行。然后,您可以修改crontab列表,以便在所需的时间使用该额外参数调用脚本。
所以,如果你想在整个半小时内运行脚本,并在4,10,16和22点做额外的事情,你可以在crontab文件中放入以下三行:
30 * * * * <script> # Thirty minutes after each hour
0 1-3,5-9,11-15,17-21,23 * * * <script> # Every whole hour, except the four designated hours
0 4,10,16,22 * * * <script with extra argument> # Script with extra argument at designated hours.
通过这种方式,脚本每30分钟运行一次,但是在指定的时间,脚本将使用额外的参数运行。
答案 1 :(得分:1)
如果您可以灵活地转移到APScheduler(http://apscheduler.readthedocs.io/en/latest/userguide.html),您的工作将变得更加轻松,代码也更加可靠。
from apscheduler.schedulers.background import BackgroundScheduler
# assuming tick is your function
scheduler = BackgroundScheduler()
#cron which runs once in 6 hours
scheduler.add_job(tick, 'cron', hour='*/6')
scheduler.start()
答案 2 :(得分:0)
我看到两种解决问题的方法。
1)使用全局变量作为计数器
numOfCalls = 0
#for every func() call
func()
numOfCalls = numOfCalls + 1
2)每次执行函数时,时间戳和函数名称都可能被写入某个日志文件
from datetime import datetime, time
current_time = datetime.now().time()
with open("log.txt", "a") as myfile:
myfile.write("func " + str(current_time) + "\n")
答案 3 :(得分:0)
你所追求的是时间间隔。从同一个包datetime
,您可以创建timedelta
个对象(两个日期时间之间的差异)并将它们转换为秒
您的代码变为:
from datetime import datetime, time
now = datetime.now()
today = now.date()
minutes_accepted = 5
execution_times = [time(hour=10), time(hour=16), time(hour=22)]
for delta in [datetime.combine(today, et) - now for et in execution_times]:
if abs(delta.total_seconds()) < minutes_accepted * 60:
print 'func'