Як встановити команду у фоновому режимі, закрити термінал і повернути його до fg?


10

Я намагаюся з’ясувати, як запустити команду на задньому плані, а потім вивести її на перший план пізніше. Мені набридли підручники та відповіді, де люди заявляють, що це просто, просто додайте &до кінця команди, щоб змусити її працювати у фоновому режимі. Він працює лише в одному вікні терміналу. Я хочу поставити команду на задній план в одному терміналі і повернути її на передній план після повторного відкриття терміналу

Приклад:

$ grunt &
$ jobs
$ [1]+  Running  grunt &

Звичайно після закриття терміналу жодної роботи не знайдено.

Наступний приклад:

$ grunt & disown #the same behavior has: $ setsid grunt &
$ jobs
$ [nothing] #but ps shows that grunt is working

after close terminal, grunt doesn't work

Що я зробив не так? Хто-небудь може мені пояснити, як запустити команду у фоновому режимі і повернути її на перший план.

Відповіді:


11

Це неможливо так, як ти хочеш.

Давайте розглянемо кілька основних понять:

  • Група процесів - це сукупність споріднених процесів, про які можна сигналізувати відразу.
  • Сеанс - це сукупність груп процесів, які або приєднані до одного термінального пристрою (відомого як керуючий термінал), або не приєднані до жодного терміналу.

Якщо ви закрили термінал, усі процеси в сеансі є мертвими, крім тих (демонів), відновлених до процесу init. І немає можливості знову дати їм контрольний термінал.

Одним словом, переглядання процесів сильно обмежене в системах POSIX (демонізування - виняток), і ваші вимоги не можуть бути задоволені.


6
Технічно це відповідь правильна, але я вважаю, що відвідувачі, які мають цю проблему, знайдуть "своє рішення" в інших відповідях, де згадується екран / byobu / tmux.
Programster

Ви маєте рацію .., але, з моєї точки зору, важливіші основні поняття, щоб зрозуміти, що система працює краще, і зрозуміти, що ви хочете, і що ви робите неправильно. Дякую обом!
Тимур Файзрахманов

16
  1. Встановити screen:

    sudo apt-get install screen
  2. Початок screen:

    screen -S session_name
  3. Виконайте свої команди, що вам потрібно.

  4. Від'єднайтеся screenвід терміналу (ваші команди все ще будуть виконуватись):

    Натисніть CTRL+ a+d

  5. Закрийте термінал

  6. Відкрийте інший термінал і повторно приєднайте останній screenсеанс:

    screen -r

Для отримання додаткової інформації та додаткових варіантів screenпошуку man screen.


2
Екран або byobu (особливо якщо ви працюєте ubuntu). Byobu базується на екрані, якщо я прав, але я вважаю, що він має додаткову функціональність, що мені здається корисним і простішим у використанні, але це питання думки.
Programster

Дякую за гарну пропозицію! Можливо, це знадобиться у функції!) З Росії з любов'ю <3
Тимур Файзрахманов

@Programster, так, Byobu - колишній. екран. Він має як bybubu-screen, так і bybu-tmux.
user.dz

1
Рекомендую tmuxяк альтернативу screen.
gerrit

5

Ви пробували: byobuабо tmuxякі термінальні мультиплексори. Не зовсім те, що ви шукаєте, але воно має подібну поведінку.

byobu-screen

Потім запустіть свою команду, щоб від'єднати:

byobu-screen -d

Відновити:

byobu-screen -r

Див. Https://help.ubuntu.com/community/Screen


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