WoJ*_*WoJ 6 python unix linux datagram python-3.x
我想syslog通过阅读直接访问来自 Python 的消息/dev/log。
我(非常有限)的理解是,正确的方法是从那里读取是绑定数据报套接字。
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)
Run Code Online (Sandbox Code Playgroud)
显然/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
Run Code Online (Sandbox Code Playgroud)
我应该如何/dev/log从 Python 中读取?
编辑:根据@Barmar 的评论 - 只有一个进程可以访问,/dev/log以便该部分清晰,设备在读取之前必须是干净的。sudo lsof /dev/log不显示任何东西。
围绕这个主题的 Java 线程中的一个答案提到syslog应该在之前关闭。我也试过,lsof | grep "/dev/log"是空的,但我还是得到了错误。
是不是可以有多个进程读取/dev/log?
为了防止这种情况,需要设置一个套接字标志:
socket.SO_REUSEADDR
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Run Code Online (Sandbox Code Playgroud)
该标志告诉内核重用处于 TIME_WAIT 状态的本地套接字,而无需等待其自然超时到期。
参考: https: //docs.python.org/3/library/socket.html