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

19

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

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

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

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

wget http://example.com/file.rar
inothemo
источник
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

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

dmckee
источник
+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, чтобы обойти это.
Райан С. Томпсон