【问题标题】:How to read /dev/log?如何读取 /dev/log?
【发布时间】:2022-04-01 11:42:37
【问题描述】:

我想通过阅读/dev/log直接从Python访问syslog消息。

我的(非常有限的)理解是正确的方法是从那里读取是绑定一个数据报套接字。

import socket

sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
sock.bind('/dev/log')
sock.listen(1)
while True:
    data, addr = sock.recvfrom(1024)
    print(data)

显然/dev/log 正在使用中:

Traceback (most recent call last):
  File "readlog.py", line 4, in <module>
    sock.bind('/dev/log')
OSError: [Errno 98] Address already in use

我应该如何从 Python 中读取/dev/log


编辑:根据@Barmar 的评论-只有一个进程可以访问/dev/log,因此该部分很清楚,设备在读取之前必须是干净的。 sudo lsof /dev/log 不显示任何内容。

A answer in a Java thread 围绕这个主题提到了syslog 应该先关闭。我也试过了,lsof | grep "/dev/log" 是空的,但我还是得到了错误。
是不是可以从/dev/log 读取多个进程?

【问题讨论】:

  • 不,多个进程不可能绑定到同一个套接字,就像多个进程不能绑定到同一个 TCP 或 UDP 端口一样。
  • 您可以让多个进程从一个套接字读取,但它们必须从绑定它的进程继承它。他们每个人都可以独占访问每个数据报。
  • 使用sudo lsof /dev/log查看它打开了什么进程。
  • /dev/log 已经存在,所以你需要在调用 bind() 之前删除它
  • @Barmar:我用你的 cmets 更新了我的问题

标签: python linux python-3.x unix datagram


【解决方案1】:

为了防止这种情况,需要设置一个套接字标志:

socket.SO_REUSEADDR

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

该标志告诉内核重用处于 TIME_WAIT 状态的本地套接字,而无需等待其自然超时到期。

参考:https://docs.python.org/3/library/socket.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-02
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多