/dev/kmsg
当在尾部写入消息时,/proc/kmsg
消息会非常随机地显示,在 中永远不会出现在 中/var/log/kern.log
。
但是,dmesg
正确获取所有消息。
例子
# Terminal 1
sudo tail -f /proc/kmsg
# Terminal 2
tail -f /var/log/kern.log
# Terminal 3
sudo sh -c 'echo "<1> Kernel log message" > /dev/kmsg'
sudo sh -c 'echo "<1> Kernel log message" > /dev/kmsg'
sudo sh -c 'echo "<1> Kernel log message" > /dev/kmsg'
sudo sh -c 'echo "<1> Kernel log message" > /dev/kmsg'
结果:
# Terminal 1
# The message is shown at irregular intervals without a clear pattern
sudo tail -f /proc/kmsg
<9>[37102.185491] Kernel log message
# Terminal 2
# No message is ever shown
tail -f /var/log/kern.log
# Terminal 4
# Everything is always here
dmesg
[37101.556366] Kernel log message
[37102.185491] Kernel log message
[37103.042422] Kernel log message
当插入 USB 记忆棒时,数据会在/proc/kmsg
和 的输出之间随机分配/var/log/kern.log
。dmesg
再次显示所有消息。
dmesg
与其他方法有何不同?- 为什么可以通过让另一个进程监听来破坏 rsyslog 的内核日志记录
/dev/kmsg
。为什么我的尝试没有被阻止device or resource busy
? - 为什么 rsyslog 不记录发送到的消息,
/dev/kmsg
即使它们偶尔到达proc/kmsg
?
答案1
/proc/kmsg
日志阅读器之间不可共享,如果有多个阅读器,则只有其中一个会收到任何给定的日志消息。 /dev/kmsg
可在多个日志读取器之间共享,为每个读取器提供整个日志流(速度较慢的读取器速度不足)。