Raspberry PI / systemd: запуск скрипта при выключении/выключении питания, но не при перезагрузке

Raspberry PI / systemd: запуск скрипта при выключении/выключении питания, но не при перезагрузке

На 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)

Потратив еще немного времени, я нашел гораздо более простое решение, которое делало именно то, что я искал:

  1. Создать каталог /etc/systemd/system/systemd-poweroff.service.d, если он еще не существует
  2. Создайте новый файл poweroff.confв /etc/systemd/system/systemd-poweroff.service.dкаталоге:
[Service]
ExecStartPre=/usr/local/bin/poweroff.sh

При таком подходе нет необходимости добавлять новую услугу.

Связанный контент