Estou aprendendo a usar o systemd notify. Estou pensando que é uma espécie de mecanismo, que permite que um processo envie uma notificação para outro processo.
Então, tentei fazer uma notificação com o comando systemd-notify --ready --status="hello"
. Então eu recebi um erro: No status data could be sent: $NOTIFY_SOCKET was not set
. Parece que precisa de um ouvinte, assim como o soquete. Mas não sei como fazer um listener receber essa notificação.
Além disso, sei que o serviço do systemd tem alguns tipos diferentes, um deles é notify
. O doc disse, Type=notify: identical to Type=simple, but with the stipulation that the daemon will send a signal to systemd when it is ready.
. Então parece que o serviço cujo tipo é notify também pode enviar notificação, mas também não sei como usar.
A
systemd-notify
ferramenta destina-se especificamente a ser usada por um shell executado como um serviço systemd usandoType=notify
.Se você configurar um serviço usando
Type=notify
, o systemd configurará automaticamente um soquete de comunicação de volta para o systemd e exportará seu caminho para o serviço em$NOTIFY_SOCKET
.Ele também escutará mensagens especiais naquele soquete, como se o serviço está pronto (nesse caso, o systemd fará a transição para status
started
, desde que a inicialização seja concluída) e também o status auto-relatado do serviço, que também será relatado na saída desystemctl status mytest.service
(assumindo um serviço chamadomytest
.)Você pode ler a página do manual
systemd-notify
para todos os detalhes, mesmo que haja muita complexidade lá... Talvez o exemplo no final seja útil para ilustrar como funciona.Vamos usar esse exemplo para um experimento prático!
Crie um script como o abaixo em algum lugar do seu sistema, como
/usr/local/bin/mytest.sh
:Eu adicionei alguns
sleep 10
s para que você possa ver o que acontece, ao assistir asystemctl status mytest.service
saída.Torne o script executável:
Em seguida, crie
/etc/systemd/system/mytest.service
, com conteúdo:Em seguida, recarregue o systemd (para que aprenda sobre a unidade) e inicie-o:
Em seguida, observe a saída de status, de vez em quando:
Você verá que é
starting
para os primeiros 10 segundos, após o que serástarted
e seu status será "Waiting for data…".Agora escreva alguns dados no FIFO (você precisará usá
tee
-lo para executá-lo como root):E observe o estado:
Ele mostrará o status do serviço como "Processando alguns dados" por 10 segundos, depois voltará para "Aguardando dados…".
Se você fosse escrever este código em C ou outra linguagem que suporta ligações systemd, você usaria a
sd_notify()
função para esta finalidade. Se você estiver familiarizado com C, talvez queira dar uma olhada na página do manual sd_notify(3) .Não é uma resposta completa, mas cheguei até aqui, usando "netcat"
A) em uma sessão de terminal, faça:
B) abra outra sessão de terminal e faça:
Isso funciona, mas do
netcat
lado você teránc: connect: Invalid argument
. Eu não sei como contornar isso.Para aprender o formato de mensagem sd_notify, você pode tentar isto:
terminal 1:
terminal 2:
Você verá o resultado no terminal 1: