Shrnuji komentáře do úplné odpovědi. Všimněte si, že @MarkPlotnick byl první, kdo ukázal na správné řešení.
Jak můžete vidět v ls -lL
výstup, soubor, na který odkazujete, je zásuvka , jiný než běžný soubor nebo roura.
~$ ls -lL /dev/log
srw-rw-rw- 1 root root 0 Aug 23 07:13 /dev/log
Podívejte se na první znak výstupu. To s
znamená, že soubor je soket.
Nemůžete použít mechanismus přesměrování >
z bash
(nebo AFIK, jakýkoli jiný shell) k zápisu do soketu, protože se shell pokusí otevřít soubor a open
nepodporuje zásuvky. Podrobnosti viz man open.
Musíte použít program, který se připojuje k zásuvce. Podrobnosti viz man connect.
Jako příklad můžete použít netcat
nebo socat
(viz Jak mohu komunikovat s unixovým doménovým socketem přes shell na Debian Squeeze?).
Pro úplnost můžete použít přesměrování na potrubí.
~$ mkfifo /tmp/fifo
~$ ls -l /tmp/fifo
prw-rw-rw- 1 root root 0 27 ago 15.04 /tmp/fifo
~$ echo "hello" > /tmp/fifo
Podívejte se na první znak ls
výstup. To p
znamená, že soubor je roura.
Chcete-li k přijaté (správné) odpovědi přidat nějaké další informace, můžete vidět, do jaké míry /dev/log
je jednoduše soket UNIX tím, že se do něj jako takový zapíše:
[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!!
V mém systému můžete vidět, že proces journald naslouchá tomuto soketu:
[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
Dostal mou zprávu a udělal s ní svou věc:(tj. připojení k souboru /var/log/messages).
Všimněte si, že protože protokol syslog, kterým žurnáld mluví, očekává datagramy (předpokládejme UDP), nikoli streamy (předpokládejme TCP), pokud jednoduše zkusíte zapisovat do soketu přímo pomocí nc
uvidíte chybu v systémovém volání (a nezobrazí se žádný protokol).
Porovnejte:
[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)
Poznámka:Pro přehlednost jsem vynechal některá systémová volání. Zde je důležité, že první volání specifikovalo SOCK_DGRAM, což je to, co soket /dev/log očekává (protože takto soket /dev/log
byl původně vytvořen), zatímco druhý ne, takže jsme dostali chybu.