Да, вы не должны создавать какие-либо файлы в папке / sys
. Это виртуальная файловая система, управляемая ядром. Его цель - предоставить информацию о системе и подключенных устройствах. Для этого не имеет смысла создавать файлы там пользователями.
Я потратил на это несколько дней, пытаясь заставить его работать "systemd", но разочаровался и написал сценарий-оболочку для управления зависимостями и сбоями. Каждая дочерняя служба - это обычная служба systemd, без «Requires», «PartOf» или каких-либо перехватчиков для других служб.
Мой служебный файл верхнего уровня выглядит так:
[Service]
Type=simple
Environment=REQUIRES=foo.service bar.service
ExecStartPre=/usr/bin/systemctl start $REQUIRES
ExecStart=@PREFIX@/bin/top-service.sh $REQUIRES
ExecStop=/usr/bin/systemctl stop $REQUIRES
Пока все хорошо. Файл top.service
управляет foo.service
и bar.service
. Запуск top
запускает foo
и bar
, а остановка top
останавливает foo
и bar
. Последним ингредиентом является мой сценарий top-service.sh
, который отслеживает отказы служб:
#!/bin/bash
# This monitors REQUIRES services. If any service stops, all of the services are stopped and this script ends.
REQUIRES="$@"
if [ "$REQUIRES" == "" ]
then
echo "ERROR: no services listed"
exit 1
fi
echo "INFO: watching services: ${REQUIRES}"
end=0
while [[ $end == 0 ]]
do
s=$(systemctl is-active ${REQUIRES} )
if echo $s | egrep '^(active ?)+$' > /dev/null
then
# $s has embedded newlines, but echo $s seems to get rid of them, while echo "$s" keeps them.
# echo INFO: All active, $s
end=0
else
echo "WARN: ${REQUIRES}"
echo WARN: $s
fi
if [[ $s == *"failed"* ]] || [[ $s == *"unknown"* ]]
then
echo "WARN: At least one service is failed or unknown, ending service"
end=1
else
sleep 1
fi
done
echo "INFO: done watching services, stopping: ${REQUIRES}"
systemctl stop ${REQUIRES}
echo "INFO: stopped: ${REQUIRES}"
exit 1
Не отвечаю на это. Но кому-то это может понадобиться (, потому что эта страница показывается в поиске):
должно быть
[Service]
Restart=always
RestartSec=3
https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/