GNU/Linux >> Linux Esercitazione >  >> Linux

Systemd:come eseguire lo script solo allo spegnimento (non al riavvio)

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.


Linux
  1. Come eseguire automaticamente comandi/script durante il riavvio o l'avvio

  2. Come eseguire lo script Python da Java?

  3. Come eseguire un file senza estensione .sh nella shell

  4. Come eseguire uno script bash?

  5. Come eseguo uno script prima di tutto il resto all'arresto con systemd?

Come riavviare (riavviare) Linux dalla riga di comando

Come evitare l'arresto o il riavvio accidentale in Linux

Come configurare l'esecuzione automatica di uno script Python utilizzando Systemd

Come eseguire lo script della shell come servizio SystemD in Linux

Come eseguire un comando in uno script della shell?

Come spegnere o riavviare Debian 11