/dev/log 確認

/dev/log 確認

/dev/logシステムロギングの基本項目です。 systemd 実装 (この例) の場合、/run/systemd/journal/dev-logsyslog デーモンによって処理された 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

答え1

コメントを完全な回答にまとめています。気づくツイートをサイトに埋め込む正しい解決策を最初に指摘してください。

出力に示すように、ls -lLリンクが指すファイルは次のとおりです。ソケット、通常のファイルやパイプではありません。

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

出力の最初の文字を見てください。これはsファイルがソケットであることを意味します。

>bashシェルが試みているので、ソケットに書き込むために(またはAFAIK、他のシェル)リダイレクトメカニズムを使用することはできません。開いているこのファイルはソケットをサポートしませんopen。バラより男が開くもっと学ぶ。

ソケットに接続するプログラムを使用する必要があります。バラより人々はつながるもっと学ぶ。

たとえば、次のように使用できます。netcatまたはsocat(参照Debian Squeezeでシェルを介して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ファイルがパイプであることを意味します。

答え2

/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!!

私のシステムでは、ロギングプロセスがこのソケットを受け取っていることがわかります。

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ファイルに追加されました)。

ジャーナルが話すsyslogプロトコルにはストリーム(TCPの考え)ではなくデータグラム(UDPの考え)が必要なので、ソケットに直接書き込もうとするとシステムコールncにエラーが表示されます。表示されます)。

比較する:

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)

明確にするために、いくつかのシステムコールを省略しました。ここで重要なのは、最初の呼び出しは/ dev / logソケットが期待するSOCK_DGRAMを指定しますが(/dev/logソケットが元々生成された方法なので)、2番目の呼び出しは指定されていないため、Gotエラーが発生することです。

答え3

/run/systemd/journal/dev-log、その権限、およびそれを使用する人を確認する必要があります。リンクを確認してください。

関連情報