Відповіді:
Пропоноване рішення - запустити сервісний блок як звичайний сервіс - ознайомтеся з [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
.
Я щойно отримав це від систематизованого 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=
не змінювати залежності.
Щоб запустити службу безпосередньо перед запуском будь-якої служби перезавантаження / вимкнення / зупинки / 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
Щоб запустити скрипт безпосередньо перед перезавантаженням / вимкненням / 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
.