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

60

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

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

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

Теги:
asynchronous

4 ответа

69
Лучший ответ

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

$ myscript &

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

  • 1
    Я знал, что это будет легко, спасибо огромное ... Linux - это не мое, но я пытаюсь набрать скорость ... Кстати, будет ли это работать в сочетании с nohup?
  • 1
    @LorenVS, я так думаю.
Показать ещё 5 комментариев
27
nohup cmd

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

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

nohup cmd &

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

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

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

  • 1
    Круто, безумно, как все сочетается, я думаю, что порядок сначала дойдет до меня, но я полагаю, вы могли бы просто запомнить его (то, что вы написали или "nohup cmd &> / dev / null 2> & 1" :))
  • 0
    Я наткнулся на это сегодня вечером. Я боролся со сценарием оболочки в течение 2 дней, и это предложение заработало. Спасибо, Мучо!
Показать ещё 4 комментария
20

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

Б.Г.

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

  • 1
    Спасибо, это крутой трюк ... Начинаю по-настоящему ценить доброту снаряда ...
18

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

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

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

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

    • Процесс не получит отправленный SIGHUP.
    • Он полностью независим от управления заданиями и может в принципе использоваться также для работы на переднем плане (хотя это и не очень полезно).
    • Обычно используется с & (в качестве фонового задания).
  • 0
    Я не могу найти disown в Debian или OS X. Я думал, что это была программа, но я, кажется, ошибаюсь. Что это?
  • 0
    команда disown и на OSX
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню