Как установить команду в фоновом режиме, закрыть терминал и вернуть его в 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 (демонизация является исключением), и ваши требования не могут быть удовлетворены.

sgx1
источник
6
Технически это правильный ответ, но я полагаю, что посетители, у которых возникла эта проблема, найдут «свое решение» в других ответах, в которых упоминается screen / byobu / tmux.
Программист
Вы правы ... но, с моей точки зрения, основные понятия важнее, чтобы лучше понять, как работает система, и понять, чего вы хотите, а что нет. Спасибо вам обоим!
Тимур Файзрахманов
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
Экран или бёбу (особенно если вы работаете в Ubuntu). Byobu основан на экране, если я прав, но я обнаружил, что у него есть дополнительные функции, которые я считаю полезными и более простыми в использовании, но это вопрос мнения.
Программист
Спасибо, хорошее предложение! Возможно, это понадобится в функции!) Из России с любовью <3
Тимур Файзрахманов
@ Программист, да, Бёбу - бывший. экран. Он имеет как byobu-screen, так и byobu-tmux.
user.dz
1
Я рекомендую tmuxв качестве альтернативы screen.
gerrit
5

Вы пробовали: byobuили tmuxкакие терминальные мультиплексоры. Не совсем то, что вы ищете, но у него похожее поведение.

byobu-screen

Затем выполните команду, чтобы отсоединить:

byobu-screen -d

Возобновить:

byobu-screen -r

Смотрите https://help.ubuntu.com/community/Screen

user.dz
источник
Те тоже +1.
сокольничий