Chociaż wszystkie poprzednie odpowiedzi tutaj spełniają wymóg doskonałości, możesz również wyłączyć maszynę, gdy tylko zadania zostaną wykonane.
bashskrypty mogą być trapped, co oznacza, że niektóre sygnały mogą być przechwytywane, a niektóre zadania mogą być wykonywane w razie potrzeby. EXITjest jednym z sygnałów, które mogą zostać uwięzione.
Byłbyś w stanie:
- Ustaw a
trapdla EXITswoich automatycznych skryptów powłoki, co oznacza zakończenie automatycznych zadań
- Ustaw
trapdla swojego .bashrc EXIT, co oznacza, że za każdym razem, gdy wylogujesz się z tego urządzenia, wyłącz je.
Opcja nr 1 byłaby idealnym rozwiązaniem, pod warunkiem, że twoje zadania nie wymagają kontroli adhoc i ręcznej oceny.
Opcja nr 2 obejmowałaby przypadki, w których zapomniałbyś wyjść z terminala bez wyłączania zasilania. Jest jednak zastrzeżenie; jeśli masz wiele otwartych terminali na tym samym komputerze i wyjdziesz z jednego z nich, nadal będzie ono wyłączać urządzenie. (Można tego użyć w skryptach, aby tego uniknąć, ale nie skomplikuję rozwiązania).
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
Może to być na końcu .bashrcopcji nr 2, gdzieś na górze skryptu dla opcji nr 1.
Dlaczego nie użyć poweroffna końcu skryptu?
Wolę używać set -eo pipefailna górze moich skryptów. Jeśli wystąpi jakikolwiek błąd, nie po cichu zawiedzie; przestanie wykonywać więcej poleceń. trapz EXITsygnałem powinno obejmować przypadki, gdy skrypt kończy się przedwcześnie z powodu błędów.
Jednak w przypadku zadań może to również oznaczać, że urządzenie zostanie zamknięte przed ich zakończeniem.
Mam prosty bashszablon, którego używam, aby ułatwić debugowanie skryptów; może to może się przydać. Zobacz tę treść .
at(wykonanie jednorazowe).