1 заметка с тегом

linux

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 сразу же его перезапустит.

 3 комментария    135   2020   init.d   linux   omega2   openwrt   procd   python   systemd