【发布时间】: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