<p>我也在开发类似的python模块。</p>
<p>根据以下链接,我们必须调用<strong>sd_journal_previous</strong>(在python系统d模块中,即journal.Reader().get_previous())。</p>
<p><a href="http://www.freedesktop.org/software/systemd/man/sd_journal_seek_tail.html" rel="noreferrer">http://www.freedesktop.org/software/systemd/man/sd_journal_seek_tail.html</a></p>
<p><a href="https://bugs.freedesktop.org/show_bug.cgi?id=64614" rel="noreferrer">https://bugs.freedesktop.org/show_bug.cgi?id=64614</a></p>
<p>此外,示例代码将消耗80-100%的CPU负载,因为即使在获取条目之后,reader的状态仍保持“可读”,这将导致poll()过多。</p>
<p>根据下面的链接,我们似乎必须在每次poll()之后调用<strong>sd_journal_process</strong>(在python systemd模块中,即journal.Reader().process()),以重置文件描述符的可读状态。</p>
<p><a href="http://www.freedesktop.org/software/systemd/man/sd_journal_get_events.html" rel="noreferrer">http://www.freedesktop.org/software/systemd/man/sd_journal_get_events.html</a></p>
<p>总之,您的示例代码是</p>
<pre><code>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_previous()
# j.get_next() # it seems this is not necessary.
p = select.poll()
p.register(j, j.get_events())
while p.poll():
if j.process() != journal.APPEND:
continue
# Your example code has too many get_next() (i.e, "while j.get_next()" and "for event in j") which cause skipping entry.
# Since each iteration of a journal.Reader() object is equal to "get_next()", just do simple iteration.
for entry in j:
if entry['MESSAGE'] != "":
print(str(entry['__REALTIME_TIMESTAMP'] )+ ' ' + entry['MESSAGE'])
</code></pre>
<p><strong>编辑</strong>:
删除了j.get_previous()之后的“j.get_next()”。</p>