GNU/Linux >> Linux の 問題 >  >> Linux

/dev/log を調べる

コメントを完全な回答に要約しています。 @MarkPlotnick が最初に正しい解決策を示したことに注意してください。

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

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

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

リダイレクト メカニズム > は使用できません bash の (または、AFIK、その他のシェル) シェルが open しようとするため、ソケットに書き込みます。 ファイルと open ソケットをサポートしていません。詳細については、man open を参照してください。

ソケットに接続するプログラムを使用する必要があります。詳細については、man connect を参照してください。

例として、 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 ファイルがパイプであることを意味します。


受け入れられた (正しい) 回答に追加情報を追加するには、 /dev/log の範囲を確認できます。 次のように書き込むことにより、単純に UNIX ソケットになります。

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

私のシステムでは、journald プロセスがこのソケットをリッスンしていることがわかります:

[email protected]:~$ 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 プロトコルはストリーム (TCP と考えてください) ではなくデータグラム (UDP と考えてください) を想定しているため、単純に nc でソケットに直接書き込もうとすると注意してください。 システムコールにエラーが表示されます (ログは表示されません)。

比較:

[email protected]:~$ 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

[email protected]:~$ 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 は最初に作成されました) が、2 番目は作成されていないため、エラーが発生しました。


Linux
  1. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

  2. / dev / stdin、/ dev / stdout、および/ dev / stderrはどの程度移植可能ですか?

  3. / dev/randomと/dev/ urandomをいつ使用するか?

  1. /dev/shm/ と /tmp/ はいつ使用する必要がありますか?

  2. /dev/zero から /dev/null への DD ...実際に何が起こるか

  3. Linux が /dev/tty と /dev/tty0 を使用する方法

  1. Linux で /dev/random を /dev/urandom にリンクするのは間違っていますか?

  2. echo または print /dev/stdin /dev/stdout /dev/stderr

  3. /dev/tcp を使用するために < または > が必要な理由