Асинхронные команды оболочки

102

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

LorenVS
источник
2
По теме см. Разницу между nohup, disown и & в Unix и Linux Stack Exchange.
jww
1
Для тех, кто ищет более подробный ответ, в котором рассказывается о различиях между nohup, &иdisown , нажмите здесь, чтобы перейти к четвертому ответу .
noɥʇʎԀʎzɐɹƆ

Ответы:

117

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

$ myscript &

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

Карл Норум
источник
1
Я знал, что это будет что-то легкое, большое спасибо ... Linux просто не мое, но я пытаюсь набрать скорость ... Кстати, это сработает в сочетании с nohup?
LorenVS 03
2
В чем разница между помещением & в командной строке и помещением его в скрипт? Я не знал, что они разные.
Джейкоб Шарф
8
@JacobSharf, попробуйте, и вы увидите. Если &внутри сценария и у вас его нет wait, фоновая команда будет убита при выходе из сценария.
Carl Norum
ой. Это многое объясняет. Недавно я заметил какой-то эффект, который может быть вызван этим. Поиск в Google фактически привел меня к этой странице. Спасибо
Джейкоб Шарф
Если myscriptизменяет среду терминала, например. это команда инициализации терминала, которая не нужна немедленно и может быть отложена, изменит ли она среду терминала?
noɥʇʎԀʎzɐɹƆ 08
59

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

  • & помещает работу в фоновый режим.

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

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

    • Процесс не получит ни одного отправленного SIGHUP.
    • Он полностью независим от управления заданиями и, в принципе, может использоваться и для заданий переднего плана (хотя это не очень полезно).
    • Обычно используется с &(как фоновая работа).
Ани Менон
источник
Я не могу найти disownв Debian или OS X. Я думал, что это программа, но, похоже, ошибаюсь. Что это?
jww
команда disown и на OSX
Ани Менон
6
Это лучший ответ. Самый полный.
noɥʇʎԀʎzɐɹƆ
3
Определенно лучший ответ, не знаю, почему так мало взлетов
HeberLZ
1
@VladGanshin No.
Ани Менон
40
nohup cmd

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

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

nohup cmd &

и избавьтесь от вывода,

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

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

Стив Б.
источник
2
Круто, безумие, как все сочетается, я думаю, что упорядочивание сначала
дойдет
Я наткнулся на это сегодня вечером. Я боролся со сценарием оболочки в течение 2 дней, и это предложение помогло. Спасибо, мучо!
JD Long
Замечательно, это очень полезно. При работе в фоновом режиме вы можете время от времени проверять вывод команды, используя tail nohup.out, при этом будут отображаться последние 10 строк вывода команды. Я использую это для заданий резервного копирования rsync, чтобы узнать, в каком файле он сейчас находится.
Мартин Хансен
Что, если я сделаю это, но хочу остановить фоновый процесс?
Стефан Биджзиттер 02
Оболочка печатает идентификатор задания, когда вы запускаете задание именно для этой цели. Вы можете в любой момент увидеть свои текущие задания с помощью jobs.
Tripleee
26

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

bg

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

пайтон
источник
2
Спасибо, это крутой маленький трюк ... Начинаю по-настоящему ценить некоторые достоинства оболочки ...
LorenVS,
3

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

млутра
источник
@LadenkovVladislav Я на 95% уверен, что вы можете установить screen на RedHat. У меня на CentOS.
BuvinJ
В Ubuntu я хотел подражать команде Windows / batch "start". Т.е. асинхронно запустите программу переднего плана (GUI) и продолжайте через сценарий оболочки. Это именно так.
BuvinJ