Асинхронные команды оболочки - PullRequest
73 голосов
/ 03 марта 2010

Я, честно говоря, не могу поверить, что не могу найти решение для этого онлайн. Я столкнулся с несколькими вещами, которые кажутся похожими, но ничего, что действительно делает то, что я хочу ...

Я пытаюсь использовать сценарий оболочки для запуска команды. Мне все равно, если / когда / как / почему это заканчивается. Я хочу, чтобы процесс запускался и работал, но я хочу иметь возможность немедленно вернуться к своей оболочке ...

Надеюсь, это достаточно ясно, я, вероятно, просто упускаю что-то невероятно глупое

Ответы [ 5 ]

90 голосов
/ 03 марта 2010

Вы можете просто запустить скрипт в фоновом режиме:

$ myscript &

Обратите внимание, что это отличается от помещения & в ваш скрипт, который, вероятно, не будет делать то, что вы хотите.

33 голосов
/ 30 мая 2016

Все просто забыли disown. Итак, вот резюме:

  • & переводит задание в фоновый режим.

    • Блокирует при попытке прочитать ввод и
    • Заставляет оболочку не ждать ее завершения.
  • disown удаляет процесс из управления заданиями оболочки, но оставляет его подключенным к терминалу.

    • Одним из результатов является то, что оболочка не отправит ей SIGHUP (если оболочка получает SIGHUP, она также отправляет SIGHUP процессу, что обычно приводит к завершению процесса).
    • И, очевидно, его можно применять только к фоновым заданиям (потому что вы не можете ввести его при выполнении задания переднего плана).
  • nohup отключает процесс от терминала, перенаправляет его вывод на nohup.out и экранирует его от SIGHUP.

    • Процесс не получит отправленных SIGHUP.
    • Он полностью независим от управления заданиями и, в принципе, может использоваться и для заданий переднего плана (хотя это не очень полезно).
    • Обычно используется с & (в качестве фонового задания).
32 голосов
/ 03 марта 2010
nohup cmd

не зависает при закрытии терминала. вывод по умолчанию идет в nohup.out

Вы можете комбинировать это с фоном,

nohup cmd &

и избавимся от вывода

nohup cmd > /dev/null 2>&1 &

Вы также можете disown команда. тип cmd, Ctrl-Z, bg, disown

24 голосов
/ 03 марта 2010

В качестве альтернативы, после запуска программы вы можете нажать Ctrl-Z, которая остановит вашу программу, а затем набрать

BG

, который помещает вашу последнюю остановленную программу в фоновый режим. (Полезно, если вы запустили что-то без «&» и все еще хотите это в фоновом режиме, не перезапуская его)

0 голосов
/ 13 августа 2018

screen -m -d $command$ запускает команду в отдельном сеансе. Вы можете использовать screen -r, чтобы присоединиться к начатому сеансу. Это замечательный инструмент, чрезвычайно полезный также для удаленных сессий. Узнайте больше на man screen.

...