Хотя все предыдущие ответы здесь отвечают требованиям к совершенству, вы также можете выключить машину, как только задачи будут выполнены.
bashсценарии могут быть trapвоспроизведены, что означает, что определенные сигналы могут быть перехвачены и определенные задачи могут быть выполнены при необходимости. EXITявляется одним из сигналов, которые могут быть пойманы в ловушку.
Вы сможете:
- Установите
trapдля EXITваших сценариев автоматической оболочки, что означает прекращение ваших автоматизированных задач
- Установите
trapдля себя .bashrc EXIT, то есть, когда вы выходите из этой машины, выключите его.
Вариант № 1 был бы идеальным случаем, если ваши задачи не требуют специального осмотра и ручной оценки.
Вариант № 2 будет охватывать случаи, когда вы забудете выйти из терминала без отключения питания. Есть предостережение, хотя; если у вас открыто несколько терминалов на одной машине, и вы выходите из одной из них, она все равно выключит машину. (Это может быть написано в сценарии, чтобы избежать этого, но я не буду усложнять решение.)
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
Это может быть в конце .bashrcварианта № 2, в верхней части вашего сценария для варианта № 1.
Почему бы не использовать poweroffв конце сценария?
Я предпочитаю использовать set -eo pipefailв верхней части моих сценариев. Если произойдет какая-либо ошибка, она не потерпит молчания; это остановит выполнение большего количества команд. trapот EXITсигнала должен охватывать случаи , когда скрипт завершается преждевременно из - за ошибки.
Однако для ваших задач это также может означать, что машина выключится, прежде чем они будут завершены.
У меня есть простой bashшаблон, который я использую для облегчения отладки скриптов; может быть, это может быть полезным. Пожалуйста, посмотрите эту суть .
at(разовое исполнение).