Estoy resumiendo los comentarios a una respuesta completa. Tenga en cuenta que @MarkPlotnick fue el primero en señalar la solución correcta.
Como puedes ver en ls -lL
salida, el archivo apuntado por su enlace es un socket , no un archivo regular o una canalización.
~$ ls -lL /dev/log
srw-rw-rw- 1 root root 0 Aug 23 07:13 /dev/log
Mire el primer carácter de la salida. Ese s
significa que el archivo es un socket.
No puedes usar el mecanismo de redirección >
de bash
(o, AFIK, cualquier otro shell) para escribir en un socket porque el shell intentará abrir el archivo y open
no admite enchufes. Ver hombre abierto para más detalles.
Tienes que usar un programa que se conecte a un enchufe. Ver man connect para más detalles.
Como ejemplo, puede usar netcat
o socat
(consulte ¿Cómo puedo comunicarme con un socket de dominio Unix a través del shell en Debian Squeeze?).
En aras de la exhaustividad, puede utilizar la redirección en las tuberías.
~$ mkfifo /tmp/fifo
~$ ls -l /tmp/fifo
prw-rw-rw- 1 root root 0 27 ago 15.04 /tmp/fifo
~$ echo "hello" > /tmp/fifo
Mira el primer carácter del ls
producción. Ese p
significa que el archivo es una canalización.
Para agregar información adicional a la respuesta aceptada (correcta), puede ver hasta qué punto /dev/log
es simplemente un socket UNIX escribiendo en él como tal:
[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!!
En mi sistema, puede ver que el proceso journald está escuchando este socket:
[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
Recibió mi mensaje e hizo lo suyo:(es decir, agregarlo al archivo /var/log/messages).
Tenga en cuenta que debido a que el protocolo syslog del que habla journald espera datagramas (piense en UDP), no transmisiones (piense en TCP), si simplemente intenta escribir en el socket directamente con nc
verá un error en la llamada al sistema (y no aparecerá ningún registro).
Comparar:
[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)
Tenga en cuenta que elidí algunas llamadas al sistema para mayor claridad. El punto importante aquí es que la primera llamada especificó SOCK_DGRAM, que es lo que espera el socket /dev/log (ya que así es como el socket /dev/log
se creó originalmente), mientras que el segundo no, por lo que obtuvimos un error.