Процеси у фоновому режимі без “&”


24

Скажімо, ви запустили нову програму в Linux (наприклад, текстовий редактор тощо), але ви забули використовувати "&". Які команди (команди) ви б використали для того, щоб цей процес запускався у фоновому режимі, при цьому НЕ потрібно закривати цю програму? Таким чином, у вас можуть бути відкриті та окремо працюючі процеси (наприклад, термінал командного рядка, який ви використовували для створення процесу, і такий процес, як текстовий редактор, все ще запущений.?


Технічно це не так, але, можливо, 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
убий -STOP, а потім вбий -CONT
Мішель Білло,

10

На Bash:

Ctrl+ Zі потім bg.

Тепер запустіть jobsі подивіться результат.


2
@grooveplex Томаш відповів першим, тому було б доречніше прокоментувати нижче відповіді Стівена, що його в основному є відповідь Томаса ще трохи детальніше.
Антон

2
Ми насправді відповіли одночасно. Не дивно, що ми обидва сказали те саме, оскільки це очевидна відповідь :-) Ніхто з нас не копіював іншого. Моя відповідь надійшла незабаром після Томаса, тому що я витратив додатковий час на створення та форматування прикладу.
Стівен Харріс

1
А мій каже, що це в Баші, тому вони не однакові.
Томаш

1
Хе, там є потенційний момент. Для оболонки потрібно контролювати роботу. Деякі з перших машин, над якими я працював (на основі SVr2), не мали цього, /bin/shі це не працювало б :-)
Стівен Харріс,

1

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

    #!/bin/sh

    EDITOR="emacs" # or whatever

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

Вище ми спершу намагаємося визначити, чи є у вас сервер X, а потім запустити редактор у фоновому режимі (якщо ні, то багато редакторів Unix замість цього використовуватимуть ваш термінал, і ви не хочете запускати редактор як фоновий процес у цьому випадку) . Він передасть усі аргументи вашому редактору вибору дословно ( "$@") так само, як ви вказали для сценарію обгортки.

Щодо команди, якої вам не вистачає ... Згідно з моїм базовим експериментом, для програм GUI, які не включають термінал, це може бути таким же простим, як спочатку надсилання SIGSTOPта потім SIGCONTпроцес переднього плану (використовуючи killкоманду, якщо ви використовуєте скрипт оболонки для реалізації цього) . Звичайно, потрібно запустити його в іншому вікні / вкладці терміналу, і складність полягатиме в тому, щоб зручно і загально знайти ПІД, на який ви хочете відправити свій сигнал. Ви можете за замовчуванням надіслати два сигнали всім процесам даного імені (за замовчуванням у своєму улюбленому редактору і дозволити також використовувати PIDs як аргументи):

    #!/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командами , які ми ігноруємо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.