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

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

nm-applet

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

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

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

nm-applet &

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

167
задан 6 June 2014 в 03:18

9 ответов

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

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

Пример:

setsid gnome-calculator

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

gnome-calculator & disown

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

(gnome-calculator &)

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

nohup gnome-calculator

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

Интернет полон screen учебных пособий, но вот простой краткий старт:

0
ответ дан 6 June 2014 в 03:18

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

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

nm-applet &

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

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

Делать все сразу:

nm-applet & exit
0
ответ дан 6 June 2014 в 03:18

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

bg

, чтобы отправить запущенный процесс в фоновый режим. Вместо этого введите

fg

, чтобы вернуть запущенный процесс на передний план.

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

0
ответ дан 6 June 2014 в 03:18

Используйте (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
0
ответ дан 6 June 2014 в 03:18

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

nohup nm-applet &  

, чтобы игнорировать сигнал завершения при закрытии терминала. С этим проблем нет.

0
ответ дан 6 June 2014 в 03:18

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

0
ответ дан 6 June 2014 в 03:18

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

sudo -b matlab

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

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

0
ответ дан 6 June 2014 в 03:18

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

0
ответ дан 6 June 2014 в 03:18

В случае использования KDE, вы также можете использовать kstart, который запустит вашу программу без подключения к терминалу. Это также гарантирует, что среда KDE правильно настроена для команды. (См. Исходный код kstart.cpp для справки . Как вы видите, он использует KProcess::startDetached, а KProcess является производным от QProcess и запускается startDetached новый процесс и отрывается от него.)

Похоже также kde-open или xdg-open или gnome-open.

0
ответ дан 6 June 2014 в 03:18

Другие вопросы по тегам:

Похожие вопросы: