вставить в сервис, чтобы обеспечить выполнение последующего сервиса после запуска сервиса на другом компьютере

Вопрос или проблема

У меня есть служба на моем RPi (MySensors Gateway mysgw), которую я хотел бы запустить после того, как Home Assistant (HA) будет в сети. HA работает в виртуальной машине на другом компьютере (Ubuntu 20.04). Home Assistant опубликует сообщение (online) на MQTT брокере, когда полностью запустится. Это занимает около 7 минут от холодного запуска до online.

Это можно обнаружить с помощью этого скрипта, работающего на RPi: (обратите внимание, что запрос к MQTT брокеру будет выдавать сообщения об ошибках, такие как “недоступно”; эти сообщения игнорируются.)

# ждите 5 секунд (-W 5) в попытке получить 1 строку вывода (-C 1) данных из темы MQTT брокера "homeassistant/status" и не выводите никаких сообщений об ошибках.    
while [ "$(mosquitto_sub -h $MQTThost -t homeassistant/status -C 1 -W 5 --quiet)" !=  "online" ]
    do
      sleep 15
    done

где $MQTThost является посредником между mysgw и HA.

Что я хотел бы сделать, так это превратить этот скрипт в службу, и служба mysgw.service будет запускаться после завершения этого скрипта.

Я могу поместить этот код в файл /usr/local/bin/mysgwWait4HA.sh и создать заголовок службы /etc/systemd/system/mysgwWait4HA.service, который содержит:

[Unit]
Description=Ожидание, пока Home Assistant не станет доступным
Requires=network.target

[Service]
ExecStart=/usr/local/bin/mysgwWait4HA.sh

[Install]
WantedBy=multi-user.target

и в секцию [Unit] файла /etc/systemd/system/mysgw.service добавить в строку Requires, mysgwWait4HA. например:

Requires=network.target mysgwWait4HA

Часть, которую я не понимаю, это то, что эта новая служба будет завершаться. Запустится ли mysgw.service, когда запустится эта новая служба? Кажется, что эта новая служба должна установить флаг, который указывает, что завершение произошло, и этот флаг указывает, что mysgw.service теперь должен начать работу.

Что я упускаю?

Спасибо за вашу помощь

-OSD

Ответ или решение

Как создать зависимость между службами в системе Linux: практическое руководство

Ваша задача заключается в том, чтобы запустить службу mysgw после того, как Home Assistant (HA) станет доступным. Для достижения этой цели вы рассматриваете вариант создания службы, которая будет ожидать, пока HA не будет онлайн, прежде чем позволить запуститься mysgw. Давайте разберем детали этого решения.

Подход к решению проблемы

Вы уже правильно определили, что основа вашего решения заключается в использовании системных служб и механизма systemd. Давайте рассмотрим необходимые шаги по созданию такой зависимости между службами.

Шаг 1: Создание скрипта ожидания

Сначала создайте скрипт, который будет выполнять проверку на статус Home Assistant через MQTT. Ваш скрипт /usr/local/bin/mysgwWait4HA.sh должен выглядеть следующим образом:

#!/bin/bash

# Задержка для успокоения MQTT до старта HA
sleep 5

# Ожидание, пока Home Assistant не станет онлайн
while [ "$(mosquitto_sub -h $MQTThost -t homeassistant/status -C 1 -W 5 --quiet)" != "online" ]
do
    sleep 15
done

Не забудьте сделать этот скрипт исполняемым:

chmod +x /usr/local/bin/mysgwWait4HA.sh

Шаг 2: Создание службы ожидания

Теперь давайте создадим файл службы для вашего скрипта. Создайте файл /etc/systemd/system/mysgwWait4HA.service со следующим содержанием:

[Unit]
Description=Ожидание, пока Home Assistant не будет в сети
Requires=network.target

[Service]
ExecStart=/usr/local/bin/mysgwWait4HA.sh

[Install]
WantedBy=multi-user.target

Шаг 3: Обновление службы mysgw

Теперь необходимо указать, что служба mysgw должна зависеть от службы ожидания. Откройте файл /etc/systemd/system/mysgw.service и добавьте зависимость:

[Unit]
Description=MySensors Gateway
Requires=network.target mysgwWait4HA.service
After=mysgwWait4HA.service

[Service]
ExecStart=/path/to/mysgw

[Install]
WantedBy=multi-user.target

Шаг 4: Активация служб

После того как вы создали/обновили службы, вам необходимо перезагрузить конфигурацию systemd и активировать обе службы:

sudo systemctl daemon-reload
sudo systemctl enable mysgwWait4HA.service
sudo systemctl enable mysgw.service

Шаг 5: Запуск служб

Теперь вы можете запустить службу ожидания, а также убедиться, что служба mysgw автоматически запустится после завершения работы mysgwWait4HA:

sudo systemctl start mysgwWait4HA.service

Если вы хотите протестировать, как ваша структура работает, перезагрузите Raspberry Pi и проверьте статус служб:

sudo systemctl status mysgw.service
sudo systemctl status mysgwWait4HA.service

Заключение

В этом руководстве мы рассмотрели, как создать службу ожидания для запуска другой службы в зависимости от статуса Home Assistant. Используя механизм systemd, вы сможете легко управлять запуском и зависимостями служб. Это позволит вам настроить надежный и устойчивый сервис, который будет корректно реагировать на доступность необходимых ресурсов.

Помните, что корректная настройка служб может существенно повысить надежность вашей системы. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...