AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1120023
Accepted
Yves
Yves
Asked: 2019-02-21 22:44:14 +0800 CST2019-02-21 22:44:14 +0800 CST 2019-02-21 22:44:14 +0800 CST

Como usar o sistema de notificação

  • 772

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.

notification systemd
  • 3 3 respostas
  • 25669 Views

3 respostas

  • Voted
  1. Best Answer
    filbranden
    2019-02-22T20:40:02+08:002019-02-22T20:40:02+08:00

    A systemd-notifyferramenta destina-se especificamente a ser usada por um shell executado como um serviço systemd usando Type=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 de systemctl status mytest.service(assumindo um serviço chamado mytest.)

    Você pode ler a página do manualsystemd-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:

    #!/bin/bash
    
    mkfifo /tmp/waldo
    sleep 10
    systemd-notify --ready --status="Waiting for data…"
    
    while : ; do
            read a < /tmp/waldo
            systemd-notify --status="Processing $a"
    
            # Do something with $a …
            sleep 10
    
            systemd-notify --status="Waiting for data…"
    done
    

    Eu adicionei alguns sleep 10s para que você possa ver o que acontece, ao assistir a systemctl status mytest.servicesaída.

    Torne o script executável:

    $ sudo chmod +x /usr/local/bin/mytest.sh
    

    Em seguida, crie /etc/systemd/system/mytest.service, com conteúdo:

    [Unit]
    Description=My Test
    
    [Service]
    Type=notify
    ExecStart=/usr/local/bin/mytest.sh
    
    [Install]
    WantedBy=multi-user.target
    

    Em seguida, recarregue o systemd (para que aprenda sobre a unidade) e inicie-o:

    $ sudo systemctl daemon-reload
    $ sudo systemctl start mytest.service
    

    Em seguida, observe a saída de status, de vez em quando:

    $ systemctl status mytest.service
    

    Você verá que é startingpara os primeiros 10 segundos, após o que será startede seu status será "Waiting for data…".

    Agora escreva alguns dados no FIFO (você precisará usá tee-lo para executá-lo como root):

    $ echo somedata | sudo tee /tmp/waldo
    

    E observe o estado:

    $ systemctl status mytest.service
    

    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) .

    • 14
  2. Jos
    2019-02-22T03:02:22+08:002019-02-22T03:02:22+08:00

    Não é uma resposta completa, mas cheguei até aqui, usando "netcat"

    A) em uma sessão de terminal, faça:

    export NOTIFY_SOCKET=/tmp/test.sock
    nc -l -U -u /tmp/test.sock
    

    B) abra outra sessão de terminal e faça:

    export NOTIFY_SOCKET=/tmp/test.sock
    systemd-notify --read --status="hello"`
    

    Isso funciona, mas do netcatlado você terá nc: connect: Invalid argument. Eu não sei como contornar isso.

    • 1
  3. osexp2003
    2020-03-30T07:21:58+08:002020-03-30T07:21:58+08:00

    Para aprender o formato de mensagem sd_notify, você pode tentar isto:

    terminal 1:

    $ socat unix-recv:/tmp/test.sock -
    

    terminal 2:

    $ NOTIFY_SOCKET=/tmp/test.sock systemd-notify --ready --status="hello"
    

    Você verá o resultado no terminal 1:

    READY=1
    STATUS=hello
    
    • 0

relate perguntas

  • Como fazer com que a mensagem "Sua bateria está quebrada" desapareça?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve