Как использовать systemd, уведомляют

Я изучаю, как использовать systemd, уведомляют. Я думаю, что это - своего рода механизм, который позволяет процессу отправлять уведомление другому процессу.

Так, я пытался сделать уведомление с командой systemd-notify --ready --status="hello". Затем я получил ошибку: No status data could be sent: $NOTIFY_SOCKET was not set. Кажется, что этому нужен слушатель, точно так же, как сокет. Но я не знаю, как сделать слушателя для получения этого уведомления.

Кроме того, я знал, что сервис systemd имеет некоторые различные типы, один из них notify. Сказанный документ, Type=notify: identical to Type=simple, but with the stipulation that the daemon will send a signal to systemd when it is ready.. Таким образом, кажется, что сервис, тип которого, уведомляет, может отправить уведомление также, но я не знаю, как использовать его также.

4
задан 21 February 2019 в 09:44

3 ответа

systemd-notify инструмент конкретно предназначен, чтобы использоваться оболочкой, которая работает как systemd сервисное использование Type=notify.

Если Вы настраиваете сервисное использование Type=notify, systemd автоматически настроит коммуникационный сокет назад к systemd и экспортирует его путь к службе под $NOTIFY_SOCKET.

Это также прислушается к специальным сообщениям в том сокете, такой как, готов ли сервис (в этом случае systemd, перейдет он к состоянию started, так как инициализация завершается), и также состояние, о котором самосообщают, сервиса, о котором также сообщат в выводе systemctl status mytest.service (принятие названного сервиса mytest.)

Можно прочитать страницу справочника systemd-notify для всех подробностей, даже при том, что существует большая сложность там... Возможно, пример в конце полезен в иллюстрировании, как это работает.


Давайте использовать тот пример для практического эксперимента!

Создайте сценарий как тот ниже где-нибудь в Вашей системе, такой как /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

Я добавил некоторых sleep 10s, таким образом, Вы видите то, что, происходят, при наблюдении systemctl status mytest.service вывод.

Сделайте исполняемый файл сценария:

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

Затем создайте /etc/systemd/system/mytest.service, с содержанием:

[Unit]
Description=My Test

[Service]
Type=notify
ExecStart=/usr/local/bin/mytest.sh

[Install]
WantedBy=multi-user.target

Затем перезагрузите systemd (таким образом, он узнает о единице), и запустите его:

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

Затем наблюдайте вывод состояния, время от времени:

$ systemctl status mytest.service

Вы будете видеть, что это starting в течение первых 10 секунд, после которых это будет started и его состояние будет "Ожидать данных …".

Теперь запишите некоторые данные в FIFO (необходимо будет использовать tee выполнять его как корень):

$ echo somedata | sudo tee /tmp/waldo

И часы состояние:

$ systemctl status mytest.service

Это покажет состояние сервиса как "Обрабатывающий somedata" в течение 10 секунд, затем обратно к "Ожиданию данных …".

Если бы необходимо было написать этот код в C или другом языке, который поддерживает systemd привязку, то Вы использовали бы sd_notify() функция с этой целью. Если Вы знакомы с C, Вы могли бы хотеть смотреть на sd_notify (3) страница справочника.

4
ответ дан 1 December 2019 в 09:43

Не полный ответ, но я добрался до этого, с помощью netcat:

  • на одном терминальном сеансе сделать export NOTIFY_SOCKET=/tmp/test.sock
  • затем сделайте nc -l -U -u /tmp/test/sock
  • откройте другую сессию и сделайте export NOTIFY_SOCKET=/tmp/test.sock
  • systemd-notify --read --status="hello"

Это работает, но на netcat сторона Вы доберетесь nc: connect: Invalid argument. Я не знаю, как работать вокруг этого.

0
ответ дан 1 December 2019 в 09:43

Чтобы узнать формат сообщения sd_notify, вы можете попробовать следующее:

терминал 1:

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

терминал 2:

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

Вы увидите результат в терминале 1:

READY=1
STATUS=hello
0
ответ дан 29 March 2020 в 15:21

Другие вопросы по тегам:

Похожие вопросы: