Процессы в фоновом режиме без «&»

24

Допустим, вы запустили новое приложение в Linux (например, текстовый редактор и т. Д.), Но забыли использовать «&». Какие команды вы бы использовали для запуска этого процесса в фоновом режиме, не закрывая приложение? Таким образом, вы можете иметь как открытые, так и отдельно работающие процессы (например, терминал командной строки, который вы использовали для создания процесса, и процесс, такой как текстовый редактор, все еще работающий.

D0uble7
источник
Технически нет, но, возможно, tmuxдает ту же функциональность, которая требуется в вашем вопросе
MKC
1
Не забывайте о простой альтернативе открытия другой оболочки, когда это возможно.
jpmc26

Ответы:

43

В окне терминала вы обычно набираете Control+, Zчтобы «приостановить» процесс, а затем используете bgкоманду для «фонового» его.

например, с командой сна

$ /bin/sleep 1000
^Z[1] + Stopped                  /bin/sleep 1000
$ bg
[1]     /bin/sleep 1000&
$ jobs
[1] +  Running                 /bin/sleep 1000
$ 

Мы видим, что процесс запущен, и у меня все еще есть моя командная строка.

Стивен Харрис
источник
5
Было бы интересно добавить, что процесс можно вернуть на передний план с помощью fgкоманды, которая принимает идентификатор задания ( 1в данном случае указанный в скобках ) в качестве параметра. Это не является специфическим для использования bgи может быть сделано на процессах, запущенных с &.
Аарон
14

Ctrl+ Zэто способ сделать это, но только для полноты: вопрос требует «команды», и это будет (из другого терминала):

kill -STOP pid_of_the_running_applications

а потом конечно

bg

из терминала приложения.

Радован Гарабик
источник
6
kil-STOP, а затем убить -CONT
Мишель Бийо
10

В Баше:

Ctrl+ Zа потом bg.

Теперь бегите jobsи посмотрите результат.

Tomasz
источник
2
@grooveplex Томас ответил первым, так что было бы более уместно прокомментировать ниже ответ Стивена, что его в основном является ответом Томаса с некоторыми подробностями.
Anthon
2
Мы на самом деле ответили одновременно. Не удивительно, что мы оба сказали одно и то же, поскольку это очевидный ответ :-) Никто из нас не скопировал другого. Мой ответ пришел вскоре после Томаса, потому что я потратил дополнительное время на создание и форматирование примера.
Стивен Харрис
1
И мой говорит, что это в Bash, так что они не одинаковы.
Томаш
1
Хех, там есть потенциальная точка. Это требует, чтобы у оболочки был контроль работы. Некоторые из первых машин, на которых я работал (на базе SVr2), не имели этого, /bin/shи поэтому это не сработало бы :-)
Стивен Харрис
1

В качестве меры предосторожности, связанной с неудобством необходимости нажимать CTRL- z, вы можете сделать скрипт-редактор для вашего редактора, который будет запускать ваш редактор в фоновом режиме. Таким образом, вам не нужно заботиться о том, чтобы не забыть явно запустить его в фоновом режиме:

    #!/bin/sh

    EDITOR="emacs" # or whatever

    if [ -z "${DISPLAY}" ]; then
      ${EDITOR} "$@"
    else
      ${EDITOR} "$@" &
    fi

Выше мы сначала попытаемся определить, доступен ли у вас X-сервер, и только потом запускать редактор в фоновом режиме (если нет, многие редакторы Unix вместо этого будут использовать ваш терминал, и вы не хотите запускать редактор в качестве фонового процесса в этом случае) , Он передаст все аргументы вашему редактору verbatim ( "$@") точно так же, как вы указали для сценария оболочки.

Что касается команды, которую вы пропустили ... Согласно моим основным экспериментам, для программ с графическим интерфейсом, которые не используют терминал, это может быть так же просто, как сначала отправить, SIGSTOPа затем SIGCONTв процесс переднего плана (используя killкоманду, если вы используете сценарий оболочки для реализации этого) , Вам, конечно, нужно будет запустить его в другом окне / вкладке терминала, и сложность будет заключаться в том, чтобы удобно и в общем случае найти PID, на который вы хотите отправить свой сигнал. По умолчанию вы можете отправить два сигнала всем процессам с заданным именем (по умолчанию ваш любимый редактор и разрешить использование PID в качестве аргументов):

    #!/bin/sh

    EDITOR=emacs # whatever

    stop_cont_prog()
    {
      case "$1" in
        # begin with number is considered PID - this is not good 
        # enough to be taken seriously...
        [1-9]*) kill -SIGSTOP "$1"; kill -SIGCONT "$2";;
        *)      killall -SIGSTOP "$1"; killall -SIGCONT "$2";;
      esac
    }

    if [ -n "$1" ]; then
      for prog in "$@"; do stop_cont_prog "$1"; done
    else  
      stop_cont_prog "${EDITOR}"
    fi

Этот метод правильно дал мне мои терминальные вкладки после выполнения (нескольких) emacsкоманд в фоновом режиме. Но процесс emacs, запущенный в терминале, не был должным образом восстановлен из-за управления работой оболочки или путаницы в настройках терминала. Таким образом, этот метод выиграл бы от некоторой изощренности.

Это SIGSTOPименно то, что отправляется на передний план процесса, когда вы нажимаете (по умолчанию) CTRL- z. Обратитесь к stty -aвыводу

$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]

(сокращенный вывод) и sttyстраница справочника:

   susp CHAR
          CHAR will send a terminal stop signal

Процессы, остановленные с использованием SIGSTOPсигнала, можно перезапустить, отправив SIGCONT. Обычно это управляющая логика оболочки работы , которая будет отправить SIGCONTи заботиться о других необходимых манипуляциях , связанных с fgи bgкомандами , которые мы игнорируем.

FOOF
источник