Как выключить компьютер после выполнения задачи?

25

Я обычно начинаю загрузку перед тем, как пойти в школу.
Какую команду следует использовать для автоматического сохранения и выключения компьютера после выполнения определенной задачи?
(Скажем, после установки обновлений или после загрузки большого файла.)

Я также кросс- пост на аскубунту .

Эль Бурро
источник

Ответы:

25

Это зависит от того, начали ли вы задачу. Если это какой-то инструмент командной строки, вы можете просто запустить haltили shutdown -h now:

  1. wget http://..../somelargefile; halt- haltбудет выполнен послеwget

  2. wget http://..../somelargefile && halt- haltбудет выполнен, если не wgetвернет ошибок

  3. wget http://..../somelargefile || halt- haltбудет выполнен, если wgetвернутся ошибки

Альтернативой этому является использование kshutdown- в этом приложении вы можете указать, какое действие должно быть выполнено (перезагрузка / выключение / спящий режим / и т. Д. Или выполнение команды) и когда (через некоторое время или после выхода из другого приложения). Если вы хотите использовать этот инструмент, вам нужно выбрать правильный процесс - некоторые утилиты обновления запускают несколько подпроцессов.

KShutdown

постоянный репер
источник
4
Вы также можете дать shutdownвремя для ожидания; нет необходимости использовать kshutdown для этой цели.
Каскабель
1
Нет, но shutdownне может ждать реального события.
Шадур
18

Каждый процесс имеет каталог, названный в соответствии с его идентификатором процесса (pid) в procфайловой системе. Поэтому вы можете дождаться завершения определенного процесса, проверив, существует ли его каталог повторно.

Вы можете использовать это, чтобы выполнить выключение системы после завершения процесса, как это (замените 2296 на pid для ожидания):

su -c 'while [[ -d /proc/2296 ]]; do sleep 1; done; poweroff'

Преимущества:

  • Вы можете решить, следует ли завершить работу после отключения команды оболочки
  • Завершение работы выполняется от имени пользователя root, команда ожидания не обязательно выполняется от имени пользователя root (нет необходимости sudoобходить приглашение позднего пароля).

Недостатки:

  • Может случиться, что ваш процесс завершится, и ОС затем повторно использует тот же pid для вновь порожденного процесса в течение этой секунды (состояние гонки). Таким образом, вы бы продолжали ждать завершения этого нового процесса.
moooeeeep
источник
2
Главное: это работает, даже если процесс начался.
Гейзенберг
Если вы запустили что-то с терминала, который у вас все еще открыт psв этом же терминале, это поможет вам определить PID для CMD. Если процесс был / находится на другом терминале, то вывод команды ps для всего через grep для фильтрации вашей команды должен помочь вам найти егоps -elf | grep <command_related_word>
TafT
Лучше проверить мой ответ на основе pgrepака процесса Grep ...
Жиль Quenot
Как я могу поставить эту команду в фоновом режиме?
DerWeh
1
@DerWeh Оберните его в сценарий оболочки и выполните следующие шаги: stackoverflow.com/q/625409/1025391
moooeeeep
3

Вы можете использовать &&и ||оператор команды цепи вместе. Например:

apt-get update && sleep 2 && init 0

который выполнит обновление системы с помощью aptitude, подождет 2 секунды и перейдет к уровню выполнения 0, в зависимости от вашей системы это может или не может фактически отключить оборудование.

Чтобы говорить с одной или несколькими операциями, выполняемыми после более произвольной операции, такой как, например, загрузка через веб-браузер, вам потребуется дополнительная логика для просмотра загружаемого файла, чтобы убедиться, что загрузка фактически завершена, однако логика оболочки не изменилась.

Tok
источник
3

Если вы хотите отслеживать уже запущенный процесс, вы можете сделать это в :

# while pgrep &>/dev/null -f process_name; do sleep 60; done; shutdown -h now
Жиль Квено
источник
1

Существует приложение с именем sentinella, которое может сделать это с помощью графического интерфейса пользователя: sentinella

для его установки:

sudo aptitude update
sudo aptitude install sentinella
shgnInc
источник