Linux

檢查 /dev/log

  • August 26, 2021

/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

要向接受的(正確)答案添加一些附加資訊,您可以/dev/log通過這樣寫入來查看其只是 UNIX 套接字的程度:

lmassa@lmassa-dev:~$ echo 'This is a test!!' | nc -u -U /dev/log 
lmassa@lmassa-dev:~$ sudo tail -1 /var/log/messages
Sep  5 16:50:33 lmassa-dev journal: This is a test!!

在我的系統上,你可以看到 journald 程序正在監聽這個套接字:

lmassa@lmassa-dev:~$ sudo lsof | grep '/dev/log'
systemd       1                 root   29u     unix 0xffff89cdf7dd3740       0t0       1445 /dev/log
systemd-j   564                 root    5u     unix 0xffff89cdf7dd3740       0t0       1445 /dev/log

它收到了我的消息並用它做了它的事情:(即附加到 /var/log/messages 文件)。

請注意,由於 journald 使用的 syslog 協議需要數據報(想想 UDP),而不是流(想想 TCP),如果您只是嘗試直接寫入套接字,nc您會在 syscall 中看到錯誤(並且沒有日誌顯示) .

比較:

lmassa@lmassa-dev:~$ echo 'This is a test!!' | strace nc -u -U /dev/log 2>&1 | grep connect -B10 | egrep '^(socket|connect)'
socket(AF_UNIX, SOCK_DGRAM, 0)          = 4
connect(4, {sa_family=AF_UNIX, sun_path="/dev/log"}, 10) = 0

lmassa@lmassa-dev:~$ echo 'This is a test!!' | strace nc  -U /dev/log 2>&1 | grep connect -B10 | egrep '^(socket|connect)'
socket(AF_UNIX, SOCK_STREAM, 0)         = 3
connect(3, {sa_family=AF_UNIX, sun_path="/dev/log"}, 10) = -1 EPROTOTYPE (Protocol wrong type for socket)

請注意,為了清楚起見,我省略了一些系統呼叫。這裡重要的一點是,第一個呼叫指定了 SOCK_DGRAM,這是 /dev/log 套接字所期望的(因為這是/dev/log最初創建套接字的方式),而第二個呼叫沒有,所以我們得到了一個錯誤。

我將評論總結為完整的答案。請注意,@MarkPlotnick是第一個指出正確解決方案的人。

正如您在ls -lL輸出中看到的那樣,您連結的文件是一個套接字,不是正常文件或管道。

~$ ls -lL /dev/log
srw-rw-rw- 1 root root 0 Aug 23 07:13 /dev/log

查看輸出的第一個字元。這s意味著該文件是一個套接字。

您不能使用(或,AFIK,任何其他 shell)的重定向機制>bash套接字中寫入,因為 shell 將嘗試打開文件並且open不支持套接字。有關詳細資訊,請參閱man open

您必須使用連接到套接字的程序。有關詳細資訊,請參閱man 連接

例如,您可以使用netcator socat(請參閱如何通過 Debian Squeeze 上的 shell 與 Unix 域套接字通信?)。

為了完整起見,您可以在管道上使用重定向。

~$ mkfifo /tmp/fifo
~$ ls -l /tmp/fifo
prw-rw-rw- 1 root root 0 27 ago 15.04 /tmp/fifo
~$ echo "hello" > /tmp/fifo

查看ls輸出的第一個字元。這p意味著該文件是一個管道。

引用自:https://unix.stackexchange.com/questions/464361