Python 服务 - 写入带有时间戳的文件名
Python service - writing filename with timestamp
我写了一个 Python 脚本,它将 运行 无限期地。它使用 PyInotify
监视目录,并使用 Multiprocessing
模块 运行 通过外部脚本在这些目录中创建的任何新文件。这一切都很好。
我遇到的问题是将输出写入文件。我选择的文件名使用当前日期(使用 datetime.now
)并且理论上应该每小时滚动一次。
now = datetime.now()
filename = "/data/db/meta/%s-%s-%s-%s.gz" % (now.year, now.month, now.day, now.hour)
with gzip.open(filename, 'ab') as f:
f.write(json.dumps(data) + "\n")
f.close() #Unsure if I need this, here for debug
不幸的是,当时间开始时——输出停止并且永远不会 returns。没有抛出异常,它只是停止工作。
total 2.4M
drwxrwxr-x 2 root root 4.0K Sep 8 08:01 .
drwxrwxr-x 4 root root 12K Aug 29 16:04 ..
-rw-r--r-- 1 root root 446K Aug 29 16:59 2016-8-29-16.gz
-rw-r--r-- 1 root root 533K Aug 30 08:59 2016-8-30-8.gz
-rw-r--r-- 1 root root 38K Sep 7 10:59 2016-9-7-10.gz
-rw-r--r-- 1 root root 95K Sep 7 14:59 2016-9-7-14.gz
-rw-r--r-- 1 root root 292K Sep 7 15:59 2016-9-7-15.gz #Manually run
-rw-r--r-- 1 root root 834K Sep 8 08:59 2016-9-8-8.gz
Those files aren't really owned by root, just changed them for public consumption
如您所见,所有文件时间戳都在 :59 结束,下一个小时永远不会发生。
这样做有什么需要注意的吗?有没有什么我无限期地缺少 运行 宁 Python 脚本?
看完之后。好像 PyInotify 是我的问题。
看这里 (https://unix.stackexchange.com/questions/164794/why-doesnt-inotifywatch-detect-changes-on-added-files)
我调整了你的代码,每分钟更改一次文件名,这大大加快了调试速度,但仍然在检验假设。
import datetime
import gzip, time
from os.path import expanduser
while True:
now = datetime.datetime.now()
filename = expanduser("~")+"/%s-%s-%s-%s-%s.gz" % (now.year, now.month, now.day, now.hour, now.minute)
with gzip.open(filename, 'a') as f:
f.write(str(now) + "\n")
f.write("Data Dump here" + "\n")
time.sleep(10)
这似乎 运行 没有问题。更改我的电脑的时区也被拾起并处理。鉴于上述情况,我怀疑您的错误可能出在其他地方,并且需要在关键点对值进行一些明智的调试打印。尝试使用上面更细化的文件名来加快调试速度。
我写了一个 Python 脚本,它将 运行 无限期地。它使用 PyInotify
监视目录,并使用 Multiprocessing
模块 运行 通过外部脚本在这些目录中创建的任何新文件。这一切都很好。
我遇到的问题是将输出写入文件。我选择的文件名使用当前日期(使用 datetime.now
)并且理论上应该每小时滚动一次。
now = datetime.now()
filename = "/data/db/meta/%s-%s-%s-%s.gz" % (now.year, now.month, now.day, now.hour)
with gzip.open(filename, 'ab') as f:
f.write(json.dumps(data) + "\n")
f.close() #Unsure if I need this, here for debug
不幸的是,当时间开始时——输出停止并且永远不会 returns。没有抛出异常,它只是停止工作。
total 2.4M
drwxrwxr-x 2 root root 4.0K Sep 8 08:01 .
drwxrwxr-x 4 root root 12K Aug 29 16:04 ..
-rw-r--r-- 1 root root 446K Aug 29 16:59 2016-8-29-16.gz
-rw-r--r-- 1 root root 533K Aug 30 08:59 2016-8-30-8.gz
-rw-r--r-- 1 root root 38K Sep 7 10:59 2016-9-7-10.gz
-rw-r--r-- 1 root root 95K Sep 7 14:59 2016-9-7-14.gz
-rw-r--r-- 1 root root 292K Sep 7 15:59 2016-9-7-15.gz #Manually run
-rw-r--r-- 1 root root 834K Sep 8 08:59 2016-9-8-8.gz
Those files aren't really owned by root, just changed them for public consumption
如您所见,所有文件时间戳都在 :59 结束,下一个小时永远不会发生。
这样做有什么需要注意的吗?有没有什么我无限期地缺少 运行 宁 Python 脚本?
看完之后。好像 PyInotify 是我的问题。 看这里 (https://unix.stackexchange.com/questions/164794/why-doesnt-inotifywatch-detect-changes-on-added-files)
我调整了你的代码,每分钟更改一次文件名,这大大加快了调试速度,但仍然在检验假设。
import datetime
import gzip, time
from os.path import expanduser
while True:
now = datetime.datetime.now()
filename = expanduser("~")+"/%s-%s-%s-%s-%s.gz" % (now.year, now.month, now.day, now.hour, now.minute)
with gzip.open(filename, 'a') as f:
f.write(str(now) + "\n")
f.write("Data Dump here" + "\n")
time.sleep(10)
这似乎 运行 没有问题。更改我的电脑的时区也被拾起并处理。鉴于上述情况,我怀疑您的错误可能出在其他地方,并且需要在关键点对值进行一些明智的调试打印。尝试使用上面更细化的文件名来加快调试速度。