Я изучаю, как использовать 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.
. Таким образом, кажется, что сервис, тип которого, уведомляет, может отправить уведомление также, но я не знаю, как использовать его также.
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 10
s, таким образом, Вы видите то, что, происходят, при наблюдении 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) страница справочника.
Не полный ответ, но я добрался до этого, с помощью 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
. Я не знаю, как работать вокруг этого.
Чтобы узнать формат сообщения 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