/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
答え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、その権限、およびそれを使用する人を確認する必要があります。リンクを確認してください。