Как выполнить команду после текущей команды в Bash?


19

Я загружаю файл с помощью wget, и я хочу выключить компьютер после того, как загрузка будет завершена, но мне нужно куда-то идти :) Можно ли выполнить команду в bash точно, когда процесс будет завершен?

Я знаю, что это работает:

wget http://example.com/file.rar; отключение сейчас

Но что, если я наберу только:

wget http://example.com/file.rar

2
Подумайте об использовании && и || вместо того ;. && и || проверьте возвращаемое значение предыдущей команды перед выполнением следующей команды ... на случай, если wget завершится неудачно, возможно, вы не захотите завершать работу.
— KFro

Ответы:


31

Вы можете сделать что-то вроде этого:

  1. остановить выполнение wget с помощью ctrl-z (он не остановлен, он приостановлен)
  2. положить его в фоновом режиме (BG)
  3. бежать: ждать; выключение -h сейчас

wait будет ждать всех программ, запущенных в фоновом режиме из текущей оболочки - т.е. этого wget.

После окончания ожидания отключение будет продолжено.


не забывайте выделять (fg) ваш экземпляр wget, когда закончите. Если wget уже запущен, вы можете поместить его на передний план с помощью ^ z (control-z).
— Эндрю Сканелли

4
Нет необходимости, если вы действительно не хотите видеть индикатор выполнения.
— dmckee

Нет необходимости, так как он оставляет машину себе и затем выключается.
— Вольф

11

В другой оболочке используйте

ps -u <your username> | grep wget

чтобы найти PID команды, от которой вы хотите ждать, затем

wait <PID>; shutdown -h now

так что отключение не будет запущено, пока процесс не завершится. Смотрите также ответ Депеша .


+1, только примечание: waitбудет работать только для команд, запущенных из одной оболочки
— Chriki

5

Мои решения таковы: приостановите свою долгосрочную задачу с помощью Control + Z, затем введите что-то вроде:

fg; echo "Done!"

Если вы хотите, чтобы программа реагировала по-разному в зависимости от успеха или неудачи вашей команды, используйте && и || как операторы короткого замыкания.

fg && echo "Success!" || echo "Failure!"

РЕДАКТИРОВАТЬ: Это не будет работать с sudo, потому что он попросит ваш пароль. Соответственно, я удалил примеры, используя sudo. Если вам нужно sudo для второго задания, используйте другой из методов, размещенных здесь.

С другой стороны, я считаю, что и GNOME, и KDE предлагают способы инициирования выключения / перезагрузки без использования sudo, посылая соответствующий сигнал D-Bus или что-то в этом роде.


+1 за fg..., но sudoможет возникнуть проблема, если запросит пароль
— mark4o

Хм. Да, я не использовал этот трюк для того, чтобы судить вещи, когда что-то заканчивается. Для sudo вам понадобится другой трюк. Я буду редактировать свой пост соответственно.
— Райан С. Томпсон

Для моей цели этот ответ является превосходным, поскольку он автоматически возвращает процесс на первый план
— Cookie

Кроме того, пароли для sudo могут быть отключены (для пользователя и для каждой команды) - если пользователю разрешено завершить работу через sudo один раз, ему может быть разрешено делать это всегда. В некоторых случаях враждебное отключение может быть не таким уж опасным - конечно, не таким опасным, как взломанный гостевой доступ на работающей машине.
— Cookie

1

Да, просто наберите вторую команду и нажмите ввод. Если ваша текущая программа прокручивает текст, вы не можете видеть, что вы печатаете правильно, поэтому следите за своими клавишами, чтобы вы делали это правильно.

Более разумный способ - переключиться на другой TTY (CTRL + ALT + F1 - F6) и запустить команду одновременно, или, если вы используете программу командной строки, такую ​​как screen, вы можете создать в ней новое окно.


+1 за первый вариант. Боюсь, я не понимаю, как должен работать второй вариант.
— InnaM

Нажатие, например, CTRL + ALT + F2 переключит вас на новую вторую консоль, где вы сможете войти в систему и набрать команду, таким образом вы сможете запустить вторую команду там. Во-вторых, если вы загружаете экран (программу для более удобного использования консоли), вы можете открыть вторую вкладку / окно, где вы можете снова вводить команды без необходимости повторного входа в систему. Но так как вам это нужно одновременно, вы можете остаться с вариантом 1, я не думаю, что есть другой способ добиться того же эффекта. Если вы не используете другой TTY / окно, чтобы проверить через скрипт, если процесс все еще выполняется. :-P
— Тамара Вийсман

Используйте PID ожидания из ответа dmckee
— Cookie

1

Если вы хотите стать модным, проверьте статус возврата wget и выключите его только в случае успеха.

% wget http://example.com/file.rar
% if [ $? -eq 0 ]
> then
> shutdown now
> fi

2
Это хороший подход при написании сценариев, но во время выполнения wgetвы не получите подсказку для создания теста.
— dmckee

Вы можете комбинировать это с моим Control-Z и трюком fg, чтобы обойти это.
— Райан С. Томпсон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.