Чи існує спосіб надання послідовних завдань на терміналі під час виконання завдання (без використання файлу)?


14

Припустимо, є 2 завдання t1, t2які можна виконати послідовно, як показано нижче:

t1 ; t2
# OR
t1 && t2

Тепер припустимо, я забув бігати t2і t1вже бігає; чи можу я додати t2до конвеєра так, щоб він виконувався після t1закінчення?

Відповіді:


19

Так, ти можеш:

  1. Призупиніть поточне завдання, що виконується, із символом призупинення , натискаючи Ctrl+ Z.
  2. Введіть fgабо %додайте до списку те, що ви хочете, та виконайте його, наприклад:
    fg ; systemctl suspend # or
    % ; systemctl suspend
    Оскільки fgповертається повернене значення роботи, яке воно відновилося, оператори списку подобаються &&та ||працюють як слід:
    fg && echo "Finished successfully!" # or
    % && echo "Finished successfully!"

man bash/ JOB CONTROL говорить про призупинення характеру:

Введення символу призупинення (як правило ^Z, Control- Z) під час запуску процесу зупиняє цей процес і повертає контроль до bash. (…) Користувач може потім маніпулювати станом цього завдання, використовуючи bgкоманду для продовження його у фоновому режимі, fg команду продовжувати його на передньому плані або killкоманду його вбити. A ^Zнабирає чинності негайно і має додатковий побічний ефект, що спричиняє відмову від очікування виводу та набрання голови.

fgпояснюється в man bash/ SHELL BUILTIN COMMANDS :

фг [ jobspec ]
Резюме jobspec на передньому плані, і зробити його поточне завдання. Якщо jobspec відсутня, використовується поняття оболонки поточного завдання. Зворотне значення - це команда, розміщена на передньому плані, або відмова, якщо запустити, коли контроль роботи відключений, або, якщо запускається з увімкненим контролем роботи, якщо jobspec не вказує дійсне завдання або taskpec вказує завдання, яке було розпочато без контролю роботи .

Подальше читання (окрім man bash) щодо контролю за роботою:


+1 , але це ганьба , це не працює , якщо ви забули t3в t1; t2; t3або t1 && t2 && t3.
JoL

@JoL Щоправда - ^Z^Zі %-;%+;t3досить добре в деяких випадках, але це далеко не справжнє рішення проблеми.
десерт

2

Я бачив цей метод тут: /superuser/334272/how-to-run-a-command-after-an-already-running-existing-one-finishes

де ви спочатку зробите Ctrl+, zщоб зупинити (призупинити) запущену, потім ви запустили пропущену команду так: fg && ./missed_cmd.shі вона запуститься, як тільки fgзакінчиться.

Команда fg(передній план) принесе призупинене завдання в Інтернеті, і &&буде забезпечити виконання пропущеної команди лише в тому випадку, коли перша команда буде успішною.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.