Sebbene le risposte precedenti qui soddisfino tutti i requisiti di perfezione, puoi anche spegnere la macchina non appena le attività sono state completate.
bashgli script possono essere trapped, il che significa che alcuni segnali possono essere intercettati e determinati compiti possono essere eseguiti quando necessario. EXITè uno dei segnali che possono essere intrappolati.
Saresti in grado di:
- Imposta un
trapfor per i EXITtuoi script di shell automatizzati, che significa terminare le tue attività automatizzate
- Imposta un valore
trapper .bashrc EXIT, ovvero ogni volta che esci da quella macchina, spegnilo.
L'opzione n. 1 sarebbe il caso ideale, a condizione che i tuoi compiti non richiedano ispezioni ad hoc e giudizio manuale.
L'opzione n. 2 riguarderebbe i casi in cui ti dimenticheresti di uscire dal terminale senza spegnerlo. C'è un avvertimento però; se si hanno più terminali sulla stessa macchina aperti e si esce da uno di essi, la macchina si spegnerà comunque. (Può essere scritto per evitarlo, ma non complicherò la soluzione.)
cleanup(){
# Do some tasks before terminating
echo oh la la, cleaning is so nice
echo "See you later, world"
sudo poweroff & # finally shutdown
}
trap cleanup EXIT
Questo può essere alla fine .bashrcdell'opzione n. 2, da qualche parte nella parte superiore dello script per l'opzione n. 1.
Perché non usare poweroffalla fine dello script?
Preferisco usare set -eo pipefailin cima ai miei script. Se si verifica un errore, non fallirà silenziosamente; smetterà di eseguire più comandi. trapdi EXITsegnale dovrebbe coprire i casi in cui lo script termina prematuramente a causa di errori.
Tuttavia, per le tue attività, ciò potrebbe anche significare che la macchina si spegnerà prima che siano completate.
Ho un semplice bashmodello che uso per rendere più semplice il debug degli script; forse potrebbe essere di qualche utilità. Si prega di vedere questo riassunto .
at(esecuzione singola).