Finalmente ho scoperto come farlo.
È un pensiero un po' hacker, ma funziona.
Ho usato una parte di questo thread:https://stackoverflow.com/questions/25166085/how-can-a-systemd-controllato-service-distinguish-between-shutdown-and-reboot
e questo thread:Come eseguire uno script con systemd subito prima dell'arresto?
Ho creato questo servizio /etc/systemd/system/shutdown_screen.service
[Unit]
Description=runs only upon shutdown
Conflicts=reboot.target
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/bin/bash /usr/local/bin/shutdown_screen
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Che verrà eseguito all'arresto/riavvio/interruzione/qualsiasi cosa. (non dimenticare di abilitarlo)
E nel mio script /usr/local/bin/shutdown_screen
Ho messo quanto segue :
#!/bin/bash
# send a shutdown message only at shutdown (not at reboot)
/usr/bin/systemctl list-jobs | egrep -q 'reboot.target.*start' || echo "shutdown" | nc 192.168.0.180 4243 -w 1
Che invierà un messaggio di spegnimento al mio arduino, che spegnerà il mio schermo.
Secondo il systemd.special
man-page, dovresti usare Before=poweroff.target
.
poweroff.target
A special target unit for shutting down and powering off the system. Applications wanting to power off the system should start this unit. runlevel0.target is an alias for this target unit, for compatibility with SysV.
Inoltre, come ho accennato nel mio commento, dovresti inserire script personalizzati in /etc/systemd/system/
. Il /usr/lib/systemd/system/
directory è pensata per essere utilizzata per gli script forniti dal sistema.
Quindi, forse qualcosa del genere:
[Unit]
Description=runs only upon shutdown
DefaultDependencies=no
Conflicts=reboot.target
Before=shutdown.target
Requires=poweroff.target
[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/usr/local/bin/yourscript
RemainAfterExit=yes
Dalla lettura delle risposte qui sembra che ci siano molti malintesi su come funziona systemd. In primo luogo non utilizzare i conflitti per escludere un target. È opportuno evitare che i servizi in conflitto vengano eseguiti contemporaneamente.
Se un'unità ha un'impostazione Conflicts=su un'altra unità, l'avvio della prima interromperà la seconda e viceversa.
Per Unit si intende un file .service mento per lanciare un servizio particolare non un target da raggiungere. In altre parole Conflicts=reboot.target
è privo di significato nel migliore dei casi e nel peggiore dei casi ti impedirà di riavviare. Non farlo. Ciò non significa non eseguirlo al riavvio. Significa interrompere questo servizio o reboot.target a seconda dei tempi e di come systemd interpreta questo uso errato dei conflitti.
Ecco un esempio di un'unità attualmente configurata (nota anche come file .service) che viene eseguita solo allo spegnimento e non al riavvio:
[Unit]
Description=Play sound
DefaultDependencies=no
Before=poweroff.target halt.target
[Service]
ExecStart=/usr/local/bin/playsound.sh
ExecStop=/usr/local/bin/playsound.sh
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=poweroff.target halt.target
poweroff.target è equivalente al vecchio systemv run level0 che viene raggiunto solo allo spegnimento. halt.target è un percorso di spegnimento alternativo utilizzato da systemd anch'esso non raggiungibile dal riavvio. La sezione install dice a systemd di aggiungere questo servizio all'elenco che deve essere completato prima del poweroff.target
o halt.target
sarà considerato raggiunto.
Questo servizio è installato e in esecuzione sul mio sistema.