it-swarm.com.ru

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

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

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

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

69
LorenVS

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

$ myscript &

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

86
Carl Norum
Nohup cmd

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

Вы можете сочетать это с фоном, 

Nohup cmd &

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

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

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

32
Steve B.

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

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

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

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

    • Процесс не будет получать отправленные SIGHUP.
    • Он полностью независим от управления заданиями и, в принципе, может использоваться и для переднего плана (хотя это не очень полезно).
    • Обычно используется с & (как фоновое задание).
30
Ani Menon

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

б.Г.

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

24
pajton

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

0
mluthra