我试图使用systemd库在Python中模拟这个shell命令 http://www.freedesktop.org/software/systemd/python-systemd/journal.html
实际上,我试图模拟这个命令,但在Python中。
journalctl --since=-5m --no-pager
我见过其他人在Python中通过调用journal可执行文件来实现这一点,但这是一种非常糟糕的方法。
我根据上面链接的文档编写了这个简单的脚本
import select
from systemd import journal
j = journal.Reader()
j.log_level(journal.LOG_INFO)
# j.add_match(_SYSTEMD_UNIT="systemd-udevd.service")
j.seek_tail()
j.get_next()
while j.get_next():
for entry in j:
if entry['MESSAGE'] != "":
print(str(entry['__REALTIME_TIMESTAMP'] )+ ' ' + entry['MESSAGE'])
这里有一些问题
理想情况下,从长期来看,我只想根据一组过滤器/匹配项跟踪此日志,以模拟命令“journalctl-f”,但我只需要先解决此问题。我想以这样的方式结束,但也没用。
import select
from systemd import journal
j = journal.Reader()
j.log_level(journal.LOG_INFO)
# j.add_match(_SYSTEMD_UNIT="systemd-udevd.service")
j.seek_tail()
p = select.poll()
p.register(j, j.get_events())
while p.poll():
while j.get_next():
for entry in j:
if entry['MESSAGE'] != "":
print(str(entry['__REALTIME_TIMESTAMP'] )+ ' ' + entry['MESSAGE'])
前面的答案有效,在seek_tail()之后调用get_next()的提示确实非常重要。
一种更简单的方法是(但显然,以前使用轮询的版本在更大的应用程序中更灵活)
如果您想详细了解正在发生的事情,那么下面支持调试输出的版本可能会有帮助(使用一些参数调用它将启用此功能)
对我来说,它总是在一开始就失效。不知道那到底是什么意思。对于我来说,有一些被用作迭代器的东西是无效的,我可能会以某种方式重新创建/重新打开/刷新它。但至少在我的基本测试期间,上面的代码可以正常工作。不确定是否有任何比赛条件。实际上,我很难解释这些代码是如何摆脱种族歧视的。
我也在开发类似的python模块。
根据以下链接,我们必须调用sd_journal_previous(在python系统d模块中,即journal.Reader().get_previous())。
http://www.freedesktop.org/software/systemd/man/sd_journal_seek_tail.html
https://bugs.freedesktop.org/show_bug.cgi?id=64614
此外,示例代码将消耗80-100%的CPU负载,因为即使在获取条目之后,reader的状态仍保持“可读”,这将导致poll()过多。
根据下面的链接,我们似乎必须在每次poll()之后调用sd_journal_process(在python systemd模块中,即journal.Reader().process()),以重置文件描述符的可读状态。
http://www.freedesktop.org/software/systemd/man/sd_journal_get_events.html
总之,您的示例代码是
编辑: 删除了j.get_previous()之后的“j.get_next()”。
相关问题 更多 >
编程相关推荐