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 ExecStartun'azione.
Dopo aver creato il file, assicurarsi di systemctl daemon-reloade systemctl enable yourservice --now.
L'ho appena ricevuto dall'IRC di sistema, i crediti vanno a mezcalero.
RemainAfterExit=true è richiesta quando non ce n'è ExecStartperché systemdnon tenterà di funzionare ExecStopse ritiene che il servizio non sia in esecuzione. RemainAfterExit=trueprovoca systemda credere che il servizio è in esecuzione, provocando l'esecuzione ExecStopallo 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.targetal bit Before
WantedBy=shutdown.target reboot.target halt.targetalla [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-shutdowndirectory.
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.