/dev/log
是系统日志记录的默认条目。在 systemd 实现的情况下(本例),它是指向任何/run/systemd/journal/dev-log
. 它曾经是 syslog 守护进程处理的 unix 套接字的接收端。
~$ echo "hello" > /dev/log
bash: /dev/log: No such device or address
~$ fuser /dev/log
~$ ls -la /dev/log
lrwxrwxrwx 1 root root 28 Aug 23 07:13 /dev/log -> /run/systemd/journal/dev-log
当您尝试写入时弹出错误的说明是什么,为什么没有进程保存该文件(从fuser /dev/log
空输出?
日志记录确实在系统上正常工作。
~$ logger test
~$ journalctl --since=-1m
-- Logs begin at Thu 2018-05-24 04:23:46 CEST, end at Thu 2018-08-23 13:07:25 CEST. --
Aug 23 13:07:24 alan-N551JM alan[12962]: test
扩展评论建议
~$ sudo fuser /dev/log
/run/systemd/journal/dev-log: 1 311
~$ ls -lL /dev/log
srw-rw-rw- 1 root root 0 Aug 23 07:13 /dev/log
我将评论总结为完整的答案。请注意,@MarkPlotnick是第一个指出正确解决方案的人。
正如您在
ls -lL
输出中看到的那样,您链接的文件是一个套接字,不是常规文件或管道。查看输出的第一个字符。这
s
意味着该文件是一个套接字。您不能使用(或,AFIK,任何其他 shell)的重定向机制
>
在bash
套接字中写入,因为 shell 将尝试打开文件并且open
不支持套接字。有关详细信息,请参阅man open。您必须使用连接到套接字的程序。有关详细信息,请参阅man 连接。
例如,您可以使用
netcat
orsocat
(请参阅如何通过 Debian Squeeze 上的 shell 与 Unix 域套接字通信?)。为了完整起见,您可以在管道上使用重定向。
查看
ls
输出的第一个字符。这p
意味着该文件是一个管道。要向接受的(正确)答案添加一些附加信息,您可以
/dev/log
通过这样写入来查看其只是 UNIX 套接字的程度:在我的系统上,你可以看到 journald 进程正在监听这个套接字:
它收到了我的消息并用它做了它的事情:(即附加到 /var/log/messages 文件)。
请注意,由于 journald 所使用的 syslog 协议需要数据报(想想 UDP),而不是流(想想 TCP),如果你只是尝试直接写入套接字,
nc
你会在 syscall 中看到一个错误(并且没有日志显示) .相比:
请注意,为了清楚起见,我省略了一些系统调用。这里重要的一点是,第一个调用指定了 SOCK_DGRAM,这是 /dev/log 套接字所期望的(因为这是
/dev/log
最初创建套接字的方式),而第二个调用没有,所以我们得到了一个错误。您应该验证 /run/systemd/journal/dev-log、它的权限以及谁在使用它。你正在检查一个链接。