我有一个每晚运行 python 脚本的 cronjob。 该作业将所有输出发送到日志,其中每行的时间戳精确到微秒。
该脚本的一部分包括一个循环,每次迭代之间有 5 秒的暂停。 当我排除一些问题时,我注意到 cronjob 时间戳没有反映 5 秒的暂停。 所以我然后添加了一些Python代码来打印它自己的时间戳,并且清楚地显示了5秒的暂停。
所以,我的问题是:
我的时间戳格式对于 cronjob 日志是否正确?
如果是这样 - 为什么没有显示 5 秒暂停?
如果不是 - 正确的格式是什么?
定时任务:
python myscript.py | ts '[\%Y-\%m-\%d \%H:\%M:\%.S]' >> cronjob.log 2>&1
输出:
[2024-09-05 00:23:24.226220] > Doing something (time = 2024-09-05 00:22:19.738), attempt #1...
[2024-09-05 00:23:24.226234] > Doing something (time = 2024-09-05 00:22:24.746), attempt #2...
[2024-09-05 00:23:24.226248] > Doing something (time = 2024-09-05 00:22:29.753), attempt #3...
[2024-09-05 00:23:24.226261] > Doing something (time = 2024-09-05 00:22:34.760), attempt #4...
[2024-09-05 00:23:24.226275] > Doing something (time = 2024-09-05 00:22:39.769), attempt #5...
我不太关心时间戳的排列(cronjob 与 python),但也许这是一个线索?!
注意:如果我从命令行运行
>ts '[%Y-%m-%d %H:%M:%.S]'
,时间戳将按预期工作。
看来这个问题与 cron 无关。
我尝试过以下代码
import time
from datetime import datetime
for i in range(0,5):
print(datetime.now())
time.sleep(1)
当我用
python test.py
执行它时,一切正常。但是当我尝试使用管道重定向到 tc 时。你的问题出现了。
问题是由于缓冲区造成的,管道中的缓冲区似乎是块缓冲区。
所以,对于你的问题,解决方案是冲洗
stdout
import time
from datetime import datetime
for i in range(0,5):
print(datetime.now(), flush=True)
time.sleep(1)
或
import time
import sys
from datetime import datetime
for i in range(0,5):
print(datetime.now())
sys.stdout.flush()
time.sleep(1)
以下是一些与管道缓冲区相关的答案: