Вопрос Запуск программ в фоновом режиме с терминала


Как запустить программу на фоне оболочки с возможностью закрытия оболочки при выходе из программы? Допустим, у моего пользовательского интерфейса возникают проблемы или по какой-то причине мне нужно загрузить программу из окна терминала, скажем, nm-applet:

nm-applet

Когда он запущен, он занимает передний план окна терминала.

Есть ли простой способ запустить программу в фоновом режиме, не покидая терминал или не занимая весь терминал?

В этой заметке я нашел способ запускать программы с терминала и разрешить другим входам, добавив амперсанд (&) к команде как таковой:

nm-applet &

Но это не так много, поскольку любые процессы, запущенные в терминале, убиваются после закрытия терминала.


122
2018-02-22 00:07


происхождения


nohup 'command' & Это похоже на работу. Любые проблемы с этим? - OVERTONE


ответы:


Мне недавно понравилось setsid, Это начинается с того, что вы просто запускаете что-то с терминала, но можете отключить (закрыть терминал), и он просто продолжает работать.

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

Пример:

setsid gnome-calculator

Я также довольно disown который может использоваться для разделения процесса от текущего дерева. Вы используете его совместно с фоновым амперсандом:

gnome-calculator & disown

Я также только что узнал о нерестах подоболочек с круглыми скобками. Этот простой метод работает:

(gnome-calculator &)

И, конечно, есть nohup как вы упомянули. Я не одинок nohup потому что он имеет тенденцию писать ~/nohup.out без меня прошу об этом. Если вы полагаетесь на это, это может быть для вас.

nohup gnome-calculator

И для долгосрочных процессов есть такие вещи, как screen и другие виртуальные терминальные мультиплексоры, которые поддерживают сеансы между соединениями. Вероятно, это не относится к вам, потому что вам просто нужен временный доступ к выходу терминала, но если вы хотите возвращаться через некоторое время и просмотрите последнюю работу терминала, экран, вероятно, будет вашим лучшим выбором.

Интернет полн screen но вот простой быстрый старт:


156
2018-02-22 00:41



Оли, в случае DISPLAY =: 0 единство - заменить какой из вышеупомянутых вы использовали бы и почему? - nutty about natty
@nuttyaboutnatty обертывает всю партию в свой собственный сеанс оболочки: sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown, Это в значительной степени мое решение для всего, чтобы убедиться, что он разлочен. - Oli♦
@nuttyaboutnatty Вот что я имею в виду, но вы не закончите работу с двумя экземплярами, потому что --replace делает то, что это звучит, и фактически заканчивает старый экземпляр. Запуск его во второй раз изнутри xsession закончил бы копию, привязанную к TTYn, и позволит вам использовать это в будущем, если вам это нужно. Вероятно, есть лучший способ сделать это, но только то, что приходит мне в голову, каждый раз, когда мне это нужно. - Oli♦
Отлично, тот, который работал для меня, был подоболочкой (gnome-calculator &). Я использую его для запуска приложения моноконфигурации в фоновом режиме. С помощью других методов одно приложение мгновенно сработает. - Nikolaos Georgiou
Примечание для будущих пользователей: создание nohup.out может быть подавлено с перенаправлением как stdout, так и sterr в /dev/null вот так: nohup firefox &> /dev/null & - Sergiy Kolodyazhnyy


Вот два пути, с которыми я бы пошел. Во-первых, не запускать его с терминала; удар Alt+F2 чтобы открыть диалоговое окно запуска и запустить его оттуда (без &).

С терминала запустите

nm-applet &

Но НЕ закрывайте терминал самостоятельно. То есть, не нажимайте кнопку X для закрытия и не используйте File -> Exit из своей строки меню. Если вы закроете терминал таким образом, он отправит сигнал HUP (Hang UP) к запуску bash внутри, который, в свою очередь, отправит сигнал HUP всем его дочерним элементам (именно поэтому nohup работает в этом случае).

Вместо этого выйдите из оболочки, запустив exit или удары Ctrl+D, bash затем отключит своих детей, а затем выйдет, оставив фоновый процесс все еще запущенным. И когда bash выходит, терминал потерял свой дочерний процесс, поэтому он тоже закроется.

Выполняя все это сразу:

nm-applet & exit

46
2018-02-23 11:45



Это восхитительно! Никогда не знал об этом, и вы, кажется, единственный человек, который упоминает об этом. Определенно, это мой любимый подход, когда в среде рабочего стола. Жаль, что я больше не могу повышать; - 7hi4g0
Я попробовал это с другим приложением, и это не удалось: matlab & exit Выполнение двух отдельных команд работало хорошо: matlab &  exit - MattKelly
Мне было интересно, почему OP сказал, что закрытие терминала привело к сбою его фоновых программ. Я никогда не пытался закрыть терминал кнопкой «x» в окне. - user1717828
кнопка x убивает, что он не выполняет чистое завершение, выполняется команда exit. вы можете перенаправить кнопку x на команду exit вместо этого ... - Tim Baker


Как вы указали, вы можете запустить

nohup nm-applet &  

чтобы игнорировать конечный сигнал при закрытии терминала. Нет проблем с этим.


13
2018-02-22 00:17



Любые другие альтернативы? Только ради познания, а не для чего-то еще - OVERTONE
В Википедии ( en.wikipedia.org/wiki/Nohup ) есть предложение использовать echo command | at now который я не мог заставить его работать. - desgua
Интересно, как это работает из пользовательского интерфейса при двойном щелчке значка или программы. - OVERTONE


Одна вещь, которую многие другие ответы отсутствуют, заключается в том, как отделить запущенный процесс, который в настоящее время блокирует оболочку. В большинстве терминалов и оболочек, Ctrl+Z остановит текущий процесс и вернет вас к приглашению ввода. Затем вы можете

bg

для отправки текущего процесса в фоновый режим. вопрос

fg

вместо этого перевести текущий процесс на передний план.

РЕДАКТИРОВАТЬ: Более подробно в этот ответ Я обнаружил позже.


10
2018-03-31 14:37





использование (exec PROGRAM &> /dev/null & ) чтобы позволить PID подоболочки взять на себя PROGRAM, Я несколько раз тестировал этот подход с несколькими различными программами. Закрытие исходного терминала не влияет на новоиспеченную программу

Небольшая демонстрация:

$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working

7
2017-11-30 11:35



Хммм (exec firefox) висит терминал, пока я не выйду из Firefox ... и закрыв терминал SIGHUPs оболочкой и подоболочкой - kos
Я отредактировал свой ответ. Протестировал его несколькими другими программами. Я не заметил, что firefox или другая программа висит на управляющем терминале в этой версии - Sergiy Kolodyazhnyy
хорошо работает для меня - Zanna


Я могу порекомендовать терминал byobu. Вы можете легко отсоединить свой процесс, нажав клавишу F6.


2
2018-03-05 00:07





Хотя есть хорошие ответы выше, я хотел бы дать свои 2 цента о том, как я использую MATLAB в фоновом режиме.

sudo -b matlab

-b тег sudo может запускать приложения в фоновом режиме. Вы также можете закрыть терминал после выполнения этой команды.

Вероятно, несвязанный, но есть замечательный веб-сайт, который вы можете использовать для объяснения команд оболочки. http://explainshell.com/explain/8/sudo


1
2018-06-28 14:39





Я не знаю, как это правильно, но я просто начинаю новую сессию, оставляя предыдущий. Например, я управлял простым веб-сервером на моей малине. web.py. то я начинаю новый сеанс, оставив его в покое. это оно. он также полезен, поскольку вы все еще обновляетесь, даже если работаете на другой сессии.


0
2017-07-05 22:15



Добро пожаловать в Ask Ubuntu! я рекомендую редактироватьчтобы ответить на этот вопрос, чтобы подробно рассказать о том, как это сделать. (Смотрите также Как написать хороший ответ? для общих советов о том, какие ответы наиболее ценны для Ask Ubuntu.) - David Foerster