Как выполнить команду при отключенном сервисном модуле systemd?

Как выполнить команду при отключенном сервисном модуле systemd?

У меня есть следующий сервисный модуль systemd для установки пороговых значений заряда батареи моего ноутбука:

[Unit]
Description=Set Battery Charge Thresholds

[Service]
Type=oneshot
ExecStart=/usr/bin/tpacpi-bat -s --start 1 30
ExecStart=/usr/bin/tpacpi-bat -s --stop 1 85
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Мне бы хотелось иметь возможность запускать команды при отключении сервисного блока (чтобы я мог легко вернуть пороговые значения к значениям по умолчанию). Возможно ли это?

решение1

Взгляните на ExecStopилиExecStopPost

ExecStop

Команды для выполнения, чтобы остановить службу, запущенную через ExecStart=. Этот аргумент принимает несколько командных строк, следуя той же схеме, что описана для ExecStart= выше. Использование этого параметра необязательно. После запуска команд, настроенных в этом параметре, все оставшиеся для службы процессы завершаются в соответствии с настройкой KillMode= (см. systemd.kill(5)). Если этот параметр не указан, процесс завершается отправкой сигнала, указанного в KillSignal=, когда запрашивается остановка службы. Поддерживается подстановка спецификатора и переменной среды (включая $MAINPID, см. выше).

...

Рекомендуется использовать эту настройку для команд, которые взаимодействуют со службой, запрашивающей чистое завершение. При выполнении команд, указанных с помощью этой опции, следует предположить, что служба все еще полностью запущена и способна правильно реагировать на все команды. Для шагов очистки после смертельных событий используйте ExecStopPost=.

ExecStopPost

Дополнительные команды, которые выполняются после остановки службы. Это включает случаи, когда использовались команды, настроенные в ExecStop=, когда для службы не определен ExecStop= или когда служба неожиданно завершила работу. Этот аргумент принимает несколько командных строк, следуя той же схеме, что описана для ExecStart=. Использование этих параметров необязательно. Поддерживается подстановка спецификатора и переменной среды. Обратите внимание, что — в отличие от ExecStop= — команды, указанные с этим параметром, вызываются, когда служба не запустилась правильно и снова останавливается.

Рекомендуется использовать эту настройку для операций очистки, которые должны быть выполнены даже в случае, если служба не запустилась правильно. Команды, настроенные с помощью этой настройки, должны иметь возможность работать, даже если служба не запустилась на полпути и оставила не полностью инициализированные данные. Поскольку процессы службы уже были завершены, когда команды, указанные с помощью этой настройки, выполняются, они не должны пытаться взаимодействовать с ними.

Обратите внимание, что все команды, настроенные с помощью этого параметра, вызываются с кодом результата службы, а также кодом завершения и статусом основного процесса, установленными в переменных среды $SERVICE_RESULT, $EXIT_CODE и $EXIT_STATUS. Подробную информацию см. в systemd.exec(5).

Оба эти метода можно использовать для запуска команд, когда служба остановлена.

Основные различия между ними:

  • ExecStopзапускается, пока основной процесс все еще выполняется, и будет запущен только тогда, когда служба будет остановлена ​​после обычного выполнения (то есть все службы ExecStartи ExecStartPreдолжны быть выполнены успешно, и любая из них Conditions... также должна пройти проверку).

  • ExecStopPostзапускается даже если "служба неожиданно завершилась", что покрывает сбои. Самое большое преимущество этого в том, что когда у вас есть несколько ExecStarts, если один из них успешен, а другой неуспешен, ExecStopPostможно попытаться очистить частичный успех.

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