як виконати команду після поточної запущеної команди в 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!"

EDIT: Це не буде працювати з sudo, тому що він запитає ваш пароль. Я, відповідно, видалив приклади, використовуючи sudo. Якщо вам потрібно судо для другого завдання, скористайтеся іншим способом, розміщеним тут.

З іншого боку, я вважаю, що і GNOME, і KDE пропонують способи викликати відключення / перезавантаження без використання sudo, надіславши відповідний сигнал D-Bus або щось подібне.


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

Хм. Так, я не використовував цей трюк для того, щоб бачити речі, коли щось закінчується. Для судо вам знадобиться інший трюк. Я відповідно відредагую свій пост.
Райан К. Томпсон

З моєї мети ця відповідь є вищою, оскільки вона автоматично ставить процес на перший план
Cookie

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

1

Так, просто введіть другу команду і натисніть клавішу Enter. Якщо ваша поточна програма прокручує текст, ви не бачите, що ви правильно вводили текст, тому дивіться свої клавіші, щоб ви зробили це правильно.

Розумніший спосіб - перейти на інший TTY (CTRL + ALT + F1 до F6) та запустити команду одночасно, або якщо ви використовуєте програму командного рядка, як екран, ви можете створити в ній нове вікно.


+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.