Risposte:
La soluzione suggerita è quella di eseguire l'unità di servizio come un normale servizio - dai un'occhiata alla [Install]
sezione. Quindi tutto deve essere pensato al contrario, anche le dipendenze. Perché l'ordine di spegnimento è l'ordine di avvio inverso. Ecco perché lo script deve essere inserito ExecStop=
.
La seguente soluzione funziona per me:
[Unit]
Description=...
[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>
[Install]
WantedBy=multi-user.target
RemainAfterExit=true
è necessario quando non hai ExecStart
un'azione.
Dopo aver creato il file, assicurarsi di systemctl daemon-reload
e systemctl enable yourservice --now
.
L'ho appena ricevuto dall'IRC di sistema, i crediti vanno a mezcalero.
RemainAfterExit=true
è richiesta quando non ce n'è ExecStart
perché systemd
non tenterà di funzionare ExecStop
se ritiene che il servizio non sia in esecuzione. RemainAfterExit=true
provoca systemd
a credere che il servizio è in esecuzione, provocando l'esecuzione ExecStop
allo spegnimento.
Per quanto posso vedere, fa quello che mi serve (ma non so esattamente perché).
[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
al bit Before
WantedBy=shutdown.target reboot.target halt.target
alla [Unit]
sezione. Before=
e After=
non cambiare le dipendenze.
Per eseguire un servizio subito prima di avviare uno dei servizi reboot / shutdown / halt / kexec (cioè nell'ultimo momento prima che il filesystem di root venga rimontato in sola lettura) usa questo servizio config:
[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
Abilitalo con:
systemctl enable my_service.service
Per eseguire uno script subito prima del vero riavvio / shutdown / halt / kexec (quando non è possibile scrivere sul filesystem di root, perché è stato rimontato in sola lettura) aggiungere questo script eseguibile alla /usr/lib/systemd/system-shutdown
directory.
Immediatamente prima di eseguire l'arresto di sistema reale / poweroff / reboot / kexec systemd-shutdown eseguirà tutti gli eseguibili in / usr / lib / systemd / system-shutdown / e passerà loro un argomento: "halt", "poweroff", "reboot "o" kexec ", a seconda dell'azione scelta. Tutti gli eseguibili in questa directory vengono eseguiti in parallelo e l'esecuzione dell'azione non viene continuata prima del completamento di tutti gli eseguibili.
Vedi anche:
https://www.freedesktop.org/software/systemd/man/bootup.html
https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
final.target
. Idealmente, vorrei che fosse la prima cosa che viene eseguita dopo l'utente $ sudo reboot
.
Non ne sono del tutto sicuro, ma non penso che tu abbia bisogno della parte di installazione sebbene l'ho aggiunta esplicitamente. Inoltre non l'ho provato ma penso che dovrebbe aiutarti a iniziare:
[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
.