На Raspberry PI (работает Raspbian) мне нужно запустить скрипт нанеисправность/выключение, ноне при перезагрузке.
Моей первой попыткой было определить услугу следующим образом:
[Unit]
Description=Power off service
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/usr/local/bin/poweroff.sh
[Install]
WantedBy=multi-user.target
Это сработало, но скрипт также запускался при перезагрузке. Поэтому я попробовал установить его на другую цель:
[Install]
WantedBy=shutdown.target halt.target
Но после этого изменения скрипт вообще не запускается.
Как правильно определить действия, которые следует выполнить при завершении работы?
решение1
Из того, что я собрал в сети, наилучшим вариантом будет иметь Conflicts=reboot.target
в файле модуля ( [Unit]
раздел ) и затем выполнить в скрипте следующее:
systemctl list-jobs | egrep -q 'reboot.target.*start'
Если reboot.target
запланирован запуск, это перезагрузка. В противном случае — нет. Если команда «успешна», система перезагружается. В противном случае — она выключается. Вы можете использовать это так:
if ! systemctl list-jobs | egrep -q 'reboot.target.*start'; then
echo Shutting down
fi
решение2
Ответ Дэниела решает проблему в вопросе. Но это все еще не совсем то, что мне было нужно: скрипт был вызван слишком рано, а мне нужно было, чтобы он был выполнен как можно позже (скрипт на самом деле отключает питание с помощью реле, подключенного к GPIO
пину RPi)
Потратив еще немного времени, я нашел гораздо более простое решение, которое делало именно то, что я искал:
- Создать каталог
/etc/systemd/system/systemd-poweroff.service.d
, если он еще не существует - Создайте новый файл
poweroff.conf
в/etc/systemd/system/systemd-poweroff.service.d
каталоге:
[Service]
ExecStartPre=/usr/local/bin/poweroff.sh
При таком подходе нет необходимости добавлять новую услугу.