GNU/Linux >> Belajar Linux >  >> Linux

Memeriksa /dev/log

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.


Linux
  1. Cara membuat kata sandi acak di linux menggunakan /dev/random

  2. Linux:Perbedaan Antara /dev/console , /dev/tty Dan /dev/tty0?

  3. Cara memetakan perangkat /dev/sdX dan /dev/mapper/mpathY dari perangkat /dev/dm-Z

  1. Apa itu file /dev/zero dan /dev/null di Linux?

  2. DD dari /dev/zero ke /dev/null...apa yang sebenarnya terjadi

  3. Linux:Perbedaan antara /dev/console , /dev/tty dan /dev/tty0

  1. kernel:menonaktifkan /dev/kmem dan /dev/mem

  2. Bagaimana Linux menggunakan /dev/tty dan /dev/tty0

  3. Apakah salah menautkan /dev/random ke /dev/urandom di Linux?