Есть ли способ для службы systemd найти путь к устройству и перезапустить его в случае изменения?

С современной системой инициализации (такой как systemd или upstart) вы можете просто пусть система инициализации позаботится о перезапуске сценария в случае сбоя.

Если по какой-то причине вы застряли в устаревшей системе, вы можете настроить скрипт периодически обновлять файл флагов ( touch / var / lib / myapp / flagfile ), а затем через cron проверять, если файл флага старше определенного количества секунд, и при необходимости перезапустите скрипт. Примерно так:

# get current time (in seconds since the epoch)
now=$(date +%s)

# get flag file mtime (in seconds since the epoch)
last_update=$(stat --printf '%Y' /var/lib/myapp/flagfile)

if [ $(( now - last_update )) -gt $interval ]; then
    restart_script_here
fi

Использование systemd

Если у вас есть systemd, вы просто создаете .service. unit с ключом Restart = always , который указывает systemd перезапускать скрипт в случае сбоя. Например, поместите что-то подобное в / etc / systemd / system / myscript.service`:

[Unit]
Description=This is my nifty service.
# Put any dependencies here

[Service]
Type=simple
ExecStart=/path/to/myscript
Restart=always

[Install]
WantedBy=multi-user.target

А затем активируйте его с помощью:

# systemctl enable myscript
# systemctl start myscript

Используя cron

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

2
27.05.2018, 01:33
2 ответа

En estos días, la forma canónica de ejecutar un demonio cuando un dispositivo está conectado parece ser crear una unidad systemd para el demonio y agregar una entrada udev para el dispositivo que hace referencia a esta unidad. Por ejemplo, cree un archivo /etc/udev/rules.d/90-my.rulescon la línea

ACTION=="add", KERNEL=="ttyACM*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="myacm@%k.service"

y un archivo /etc/systemd/system/myacm@.servicecon

[Unit]
Description=my serial daemon for ttyACM0
[Service]
ExecStart=/bin/myscript %i

Es posible que necesite sudo udevadm control --reloady sudo systemctl daemon-reload. Cuando conecte su dispositivo, su secuencia de comandos debe ejecutarse con el parámetro ttyACM0si ese es su nombre. Compruebe los archivos de registro en busca de errores.

Consulte la sección man 7 daemonNuevos -Daemons de estilo y Dispositivo -Activación basada , así como man systemd.device.

3
27.01.2020, 22:18

No sé si puede hacer eso dentro de systemd, pero podría usar udev para reiniciar/recargar el servicio si detecta un cambio de dispositivo.

0
27.01.2020, 22:18

Теги

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