Ответы:
Предлагаемое решение состоит в том, чтобы запустить сервисный модуль как обычный сервис - взгляните на [Install]
раздел. Так что все нужно думать наоборот, зависимости тоже. Потому что порядок выключения является обратным порядком запуска. Вот почему сценарий должен быть помещен в ExecStop=
.
Следующее решение работает для меня:
[Unit]
Description=...
[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>
[Install]
WantedBy=multi-user.target
RemainAfterExit=true
нужен, когда у вас нет ExecStart
действия.
После создания файла убедитесь, что systemctl daemon-reload
и systemctl enable yourservice --now
.
Я только что получил это от systemd IRC, кредиты идут в mezcalero.
RemainAfterExit=true
требуется, когда нет ExecStart
, потому systemd
что не будет пытаться запустить, ExecStop
если он думает, что служба не работает. RemainAfterExit=true
приводит systemd
к считаю , что служба работает, тем самым заставляя его работать ExecStop
при выключении.
Note that it is usually not sufficient to specify a command for this setting that only asks the service to terminate (for example, by queuing some form of termination signal for it), but does not wait for it to do so.
Насколько я вижу, это делает то, что мне нужно (но я не знаю точно, почему).
[Unit]
Description=Log Traffic
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
[Service]
ExecStart=/usr/local/bin/perl /home/me/log_traffic.pl --stop
Type=oneshot
kexec.target
в бит До
WantedBy=shutdown.target reboot.target halt.target
в [Unit]
раздел. Before=
& After=
не меняйте зависимости.
Чтобы запустить службу прямо перед запуском любой из служб reboot / shutdown / halt / kexec (т. Е. В последний момент перед тем, как корневая файловая система станет перемонтированной только для чтения), используйте эту конфигурацию службы:
[Unit]
Description=Save system clock on shutdown
DefaultDependencies=no
After=final.target
[Service]
Type=oneshot
ExecStart=/usr/lib/systemd/scripts/fake-hwclock.sh save
[Install]
WantedBy=final.target
Включить его с помощью:
systemctl enable my_service.service
Чтобы запустить скрипт непосредственно перед фактической перезагрузкой / shutdown / halt / kexec (когда вы не можете записать в корневую файловую систему, потому что он был перемонтирован только для чтения), добавьте этот исполняемый файл скрипта в /usr/lib/systemd/system-shutdown
каталог.
Непосредственно перед выполнением фактической остановки системы / poweroff / reboot / kexec systemd-shutdown запустит все исполняемые файлы в / usr / lib / systemd / system-shutdown / и передаст им один аргумент: либо «halt», «poweroff», «reboot» "или" kexec ", в зависимости от выбранного действия. Все исполняемые файлы в этом каталоге выполняются параллельно, и выполнение действия не продолжается до завершения всех исполняемых файлов.
Также см:
https://www.freedesktop.org/software/systemd/man/bootup.html
https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
final.target
. В идеале мне бы хотелось, чтобы это было первое, что выполняется после того, как пользователь это сделал $ sudo reboot
.
Я не совсем уверен, но я не думаю, что вам нужна часть установки, хотя я добавил ее явно. Я также не проверял это, но я думаю, что это должно помочь вам начать:
[Unit]
Description=Log Traffic
Requires=network.target
After=network.target
Before=shutdown.target
DefaultDependencies=no
[Service]
ExecStart=/home/me/so.pl
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=shutdown.target
ExecStart=/bin/true
.