procd — контроль процессов для OpenWrt

На нескольких устройствах, которые я использую в умном доме, установлены одноплатные компьютеры Onion Omega2. Это что-то между Raspberry Pi и ESP8266. Компьютер стоимостью 10$ на базе MIPS-процессора с Linux, Wi-Fi, Ethernet, UART, ШИМ, I2C, SPI, USB и GPIO. Классная игрушка!
Операционная система омеги базируется на OpenWrt, поэтому можно использовать много популярных библиотек, например Python. Только вот нет привычного менеджера процессов systemd. Я где-то читал, что команда создателей OpenWrt работает над интеграцией systemd, но по срокам пока ничего не известно.

Зато есть procd — родной для OpenWrt менеджер процессов. Он позволяет следить за процессами и перезапускать их в случае сбоев.
Для настройки сервиса достаточно создать файл в /etc/init.d/

Пример файла:

#!/bin/sh /etc/rc.common
USE_PROCD=1
START=98
STOP=1

start_service() {
	procd_open_instance
	procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}
	procd_set_param command /root/relay/controller.py
	procd_set_param stdout 1 # forward stdout of the command to logd
	procd_set_param stderr 1 # same for stderr
	procd_close_instance
}

Что тут важно:
параметр /root/relay/controller.py — это путь к нашему скрипту Python
параметр respawn — если процесс завершился раньше чем respawn_threshold, то это считается сбоем. И после respawn_retry попыток сервис останавливается.

Последовательность действий:

  1. Создаем скрипт запуска:
nano /etc/init.d/controller
  1. Устанавливаем права на запуск скрипта:
chmod +x /etc/init.d/controller
  1. Добавляем сервис в автозапуск при перезагрузке:
/etc/init.d/controller enable
  1. Запускаем сервис:
/etc/init.d/controller start

Для проверки можем убить процесс. Например, так: killall controller.py
procd сразу же его перезапустит.

Поделиться
Отправить
 166   2020   init.d   linux   omega2   openwrt   procd   python   systemd
3 комментария
Александр Диденко 2020

Не работает.
Не запускается программа /root/d30.py через старт сервиса «service d30 start» или «/etc/init.d/d30 start»

Антон Лаудэр 2020

Так... а у тебя точно OpenWRT?
И что пишет? Ошибку какую-то?
Можешь скинуть конфиг полностью?

Александр Диденко 2020

И
procd_set_param stdout 1
procd_set_param stderr 1
не выводят сообщения в logread

Антон Лаудэр 2020

У меня работает, и еще настроил отправку на центраальный сервер. Чтобы не лазить по устройствам

Александр+Диденко 2020

И правда работает. Я может файл создал неправильно, может он там не в той кодировке был. Да, заработало и то и то

Популярное