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

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

nm-applet

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

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

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

nm-applet &

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

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

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

Пример:

setsid gnome-calculator

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

gnome-calculator & disown

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

(gnome-calculator &)

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

nohup gnome-calculator

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

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

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

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

nm-applet &

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

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

Делать все это одновременно:

nm-applet & exit

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

nohup nm-applet &  

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

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

bg

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

fg

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

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

Воспользуйся (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

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

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

sudo -b matlab

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

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

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

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

Подобное также kde-open или xdg-open или gnome-open.

nohup ‘command’ и это, кажется, работает. Какие-нибудь проблемы с этим?