Saya meringkas komentar untuk jawaban yang lengkap. Perhatikan bahwa @MarkPlotnick adalah orang pertama yang menunjukkan solusi yang tepat.
Seperti yang Anda lihat di ls -lL
keluaran, file yang ditunjuk oleh tautan Anda adalah soket , bukan file biasa atau pipa.
~$ ls -lL /dev/log
srw-rw-rw- 1 root root 0 Aug 23 07:13 /dev/log
Lihatlah karakter pertama dari output. s
itu berarti file tersebut adalah soket.
Anda tidak dapat menggunakan mekanisme pengalihan >
dari bash
(atau, AFIK, shell lainnya) untuk menulis di soket karena shell akan mencoba untuk membuka file dan open
tidak mendukung soket. Lihat man open untuk detailnya.
Anda harus menggunakan program yang terhubung ke soket. Lihat man connect untuk detailnya.
Sebagai contoh, Anda dapat menggunakan netcat
atau socat
(lihat Bagaimana cara berkomunikasi dengan soket domain Unix melalui shell di Debian Squeeze?).
Demi kelengkapan, Anda dapat menggunakan pengalihan pada pipa.
~$ mkfifo /tmp/fifo
~$ ls -l /tmp/fifo
prw-rw-rw- 1 root root 0 27 ago 15.04 /tmp/fifo
~$ echo "hello" > /tmp/fifo
Lihat karakter pertama dari ls
keluaran. p
itu berarti file tersebut adalah pipa.
Untuk menambahkan beberapa info tambahan ke jawaban yang diterima (benar), Anda dapat melihat sejauh mana /dev/log
hanyalah soket UNIX dengan menuliskannya seperti:
[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!!
Di sistem saya, Anda dapat melihat bahwa proses journald mendengarkan soket ini:
[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
Itu menerima pesan saya dan melakukan hal yang sama dengannya:(yaitu menambahkan ke file /var/log/messages).
Perhatikan bahwa karena protokol syslog yang diucapkan journald mengharapkan datagram (pikirkan UDP), bukan aliran (pikirkan TCP), jika Anda hanya mencoba menulis ke soket secara langsung dengan nc
Anda akan melihat kesalahan di syscall (dan tidak ada log yang muncul).
Bandingkan:
[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)
Catatan saya menghilangkan beberapa syscalls untuk kejelasan. Poin penting di sini adalah bahwa panggilan pertama menentukan SOCK_DGRAM, yang diharapkan oleh /dev/log socket (karena ini adalah cara socket /dev/log
awalnya dibuat), sedangkan yang kedua tidak jadi kami mendapat kesalahan.