/dev/log
é a entrada padrão para log do sistema. No caso de uma implementação do systemd (neste caso), é um link simbólico para qualquer arquivo /run/systemd/journal/dev-log
. Costumava ser uma extremidade receptora de um soquete unix manipulado pelo daemon syslog.
~$ echo "hello" > /dev/log
bash: /dev/log: No such device or address
~$ fuser /dev/log
~$ ls -la /dev/log
lrwxrwxrwx 1 root root 28 Aug 23 07:13 /dev/log -> /run/systemd/journal/dev-log
Qual é o esclarecimento do erro que aparece quando você tenta gravar nele e por que não há um processo que contém esse arquivo (saída de fuser /dev/log
vazio?
O log funciona normalmente no sistema.
~$ logger test
~$ journalctl --since=-1m
-- Logs begin at Thu 2018-05-24 04:23:46 CEST, end at Thu 2018-08-23 13:07:25 CEST. --
Aug 23 13:07:24 alan-N551JM alan[12962]: test
Estendendo com sugestões de comentários
~$ sudo fuser /dev/log
/run/systemd/journal/dev-log: 1 311
~$ ls -lL /dev/log
srw-rw-rw- 1 root root 0 Aug 23 07:13 /dev/log
Estou resumindo os comentários para uma resposta completa. Observe que @MarkPlotnick foi o primeiro a apontar para a solução certa.
Como você pode ver na
ls -lL
saída, o arquivo apontado pelo seu link é um socket , não um arquivo regular ou um pipe.Observe o primeiro caractere da saída. Isso
s
significa que o arquivo é um soquete.Você não pode usar o mecanismo
>
de redirecionamento debash
(ou, AFIK, qualquer outro shell) para escrever em um soquete porque o shell tentará abrir o arquivo eopen
não oferece suporte a soquetes. Veja o homem aberto para mais detalhes.Você tem que usar um programa que se conecta a um soquete. Veja man connect para mais detalhes.
Como exemplo, você pode usar
netcat
ousocat
(veja Como posso me comunicar com um soquete de domínio Unix através do shell no Debian Squeeze? ).Por uma questão de completude, você pode usar o redirecionamento em pipes.
Observe o primeiro caractere da
ls
saída. Issop
significa que o arquivo é um pipe.Para adicionar algumas informações adicionais à resposta aceita (correta), você pode ver até que ponto
/dev/log
é simplesmente um soquete UNIX escrevendo nele como tal:No meu sistema, você pode ver que o processo journald está ouvindo este soquete:
Ele recebeu minha mensagem e fez o que queria com ela: (ou seja, anexando ao arquivo /var/log/messages).
Observe que, como o protocolo syslog que journald está falando espera datagramas (pense em UDP), não fluxos (pense em TCP), se você simplesmente tentar escrever no soquete diretamente
nc
, verá um erro no syscall (e nenhum log aparecerá) .Comparar:
Observe que elidi algumas syscalls para maior clareza. O ponto importante aqui é que a primeira chamada especificou o SOCK_DGRAM, que é o que o soquete /dev/log espera (já que foi assim que o soquete
/dev/log
foi criado originalmente), enquanto a segunda não, então recebemos um erro.Você deve verificar /run/systemd/journal/dev-log, suas permissões e quem o está usando. Você estava verificando um link.