У меня есть следующий сервисный модуль 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
Команды для выполнения, чтобы остановить службу, запущенную через ExecStart=. Этот аргумент принимает несколько командных строк, следуя той же схеме, что описана для ExecStart= выше. Использование этого параметра необязательно. После запуска команд, настроенных в этом параметре, все оставшиеся для службы процессы завершаются в соответствии с настройкой KillMode= (см. systemd.kill(5)). Если этот параметр не указан, процесс завершается отправкой сигнала, указанного в KillSignal=, когда запрашивается остановка службы. Поддерживается подстановка спецификатора и переменной среды (включая $MAINPID, см. выше).
...
Рекомендуется использовать эту настройку для команд, которые взаимодействуют со службой, запрашивающей чистое завершение. При выполнении команд, указанных с помощью этой опции, следует предположить, что служба все еще полностью запущена и способна правильно реагировать на все команды. Для шагов очистки после смертельных событий используйте ExecStopPost=.
Дополнительные команды, которые выполняются после остановки службы. Это включает случаи, когда использовались команды, настроенные в ExecStop=, когда для службы не определен ExecStop= или когда служба неожиданно завершила работу. Этот аргумент принимает несколько командных строк, следуя той же схеме, что описана для ExecStart=. Использование этих параметров необязательно. Поддерживается подстановка спецификатора и переменной среды. Обратите внимание, что — в отличие от ExecStop= — команды, указанные с этим параметром, вызываются, когда служба не запустилась правильно и снова останавливается.
Рекомендуется использовать эту настройку для операций очистки, которые должны быть выполнены даже в случае, если служба не запустилась правильно. Команды, настроенные с помощью этой настройки, должны иметь возможность работать, даже если служба не запустилась на полпути и оставила не полностью инициализированные данные. Поскольку процессы службы уже были завершены, когда команды, указанные с помощью этой настройки, выполняются, они не должны пытаться взаимодействовать с ними.
Обратите внимание, что все команды, настроенные с помощью этого параметра, вызываются с кодом результата службы, а также кодом завершения и статусом основного процесса, установленными в переменных среды $SERVICE_RESULT, $EXIT_CODE и $EXIT_STATUS. Подробную информацию см. в systemd.exec(5).
Оба эти метода можно использовать для запуска команд, когда служба остановлена.
Основные различия между ними:
ExecStop
запускается, пока основной процесс все еще выполняется, и будет запущен только тогда, когда служба будет остановлена после обычного выполнения (то есть все службыExecStart
иExecStartPre
должны быть выполнены успешно, и любая из нихConditions...
также должна пройти проверку).ExecStopPost
запускается даже если "служба неожиданно завершилась", что покрывает сбои. Самое большое преимущество этого в том, что когда у вас есть несколькоExecStart
s, если один из них успешен, а другой неуспешен,ExecStopPost
можно попытаться очистить частичный успех.