コメントを完全な回答に要約しています。 @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 番目は作成されていないため、エラーが発生しました。