cronjob 运行 python 脚本来记录 - 时间戳不正确

问题描述 投票:0回答:1

我有一个每晚运行 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]'
,时间戳将按预期工作。

python cron timestamp
1个回答
0
投票

看来这个问题与 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)

以下是一些与管道缓冲区相关的答案:

如何关闭管道中的标准输出缓冲?

在管道中强制对标准输出进行行缓冲

管道缓冲区有多大?

© www.soinside.com 2019 - 2024. All rights reserved.