Odpowiedzi:
Sugerowanym rozwiązaniem jest uruchomienie jednostki serwisowej jako normalnej usługi - spójrz na [Install]
sekcję. Więc wszystko musi być odwrócone, również zależności. Ponieważ kolejność zamykania jest odwrotną kolejnością uruchamiania. Dlatego skrypt musi zostać umieszczony ExecStop=
.
Działa dla mnie następujące rozwiązanie:
[Unit]
Description=...
[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>
[Install]
WantedBy=multi-user.target
RemainAfterExit=true
jest potrzebny, gdy nie masz ExecStart
akcji.
Po utworzeniu pliku upewnij się, że systemctl daemon-reload
i systemctl enable yourservice --now
.
Właśnie dostałem to z systemd IRC, kredyty trafią do mezcalero.
RemainAfterExit=true
jest wymagane, gdy go nie ma, ExecStart
ponieważ systemd
nie podejmie próby uruchomienia, ExecStop
jeśli uzna, że usługa nie działa. RemainAfterExit=true
Powoduje systemd
, aby wierzyć , że usługa działa, powodując w ten sposób go uruchomić ExecStop
przy wyłączaniu.
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.
O ile widzę, robi to, czego potrzebuję (ale nie wiem dokładnie, dlaczego).
[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
do bitu Przed
WantedBy=shutdown.target reboot.target halt.target
do [Unit]
sekcji. Before=
i After=
nie zmieniaj zależności.
Aby uruchomić usługę tuż przed uruchomieniem jakichkolwiek usług ponownego uruchamiania / zamykania / zatrzymania / kexec (tj. W ostatnim momencie przed ponownym zamontowaniem głównego systemu plików tylko do odczytu) skorzystaj z tej konfiguracji usługi:
[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
Włącz to za pomocą:
systemctl enable my_service.service
Aby uruchomić skrypt bezpośrednio przed ponownym uruchomieniem / zamknięciem / zatrzymaniem / kexec (gdy nie można zapisać do głównego systemu plików, ponieważ został on ponownie zamontowany tylko do odczytu), dodaj ten skrypt do /usr/lib/systemd/system-shutdown
katalogu.
Bezpośrednio przed wykonaniem rzeczywistego zatrzymania systemu / poweroff / restartu / kexec systemd-shutdown uruchomi wszystkie pliki wykonywalne w / usr / lib / systemd / system-shutdown / i przekaże im jeden argument: „halt”, „poweroff”, „restart ”lub„ kexec ”, w zależności od wybranej akcji. Wszystkie pliki wykonywalne w tym katalogu są wykonywane równolegle, a wykonywanie akcji nie jest kontynuowane przed zakończeniem wszystkich plików wykonywalnych.
Zobacz także:
https://www.freedesktop.org/software/systemd/man/bootup.html
https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
final.target
. Idealnie chciałbym, aby była to pierwsza rzecz wykonywana po wykonaniu przez użytkownika $ sudo reboot
.
Nie jestem do końca pewien, ale nie sądzę, że potrzebujesz części instalacyjnej, ale dodałem ją wyraźnie. Ja również tego nie przetestowałem, ale myślę, że powinno ci to pomóc:
[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
.