Как запустить программу в фоновом режиме оболочки с возможностью закрытия оболочки, оставляя программу работающей? Допустим, мой пользовательский интерфейс имеет проблемы или по какой-то причине мне нужно загрузить программу из окна терминала, скажем, 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 kbd> + F2 kbd>, чтобы открыть диалоговое окно запуска, и запустите его оттуда (без & amp;).
Из терминала запустите
nm-applet &
, но НЕ закрывайте терминал самостоятельно. То есть, не нажимайте кнопку X, чтобы закрыть, и не используйте File -> Exit из его меню. Если вы закроете терминал таким образом, он отправит сигнал HUP (Hang UP) на работающий внутри bash, который, в свою очередь, отправит сигнал HUP всем его дочерним элементам (именно поэтому nohup работает в этом случае).
Вместо этого выйдите из оболочки, запустив exit
или нажав Ctrl kbd> + D kbd>. После этого bash откажется от своих потомков и выйдет, оставив фоновые процессы все еще работающими. И когда bash завершает работу, терминал теряет свой дочерний процесс, поэтому он тоже закрывается.
Делать все сразу:
nm-applet & exit
Одна вещь, которую пропускают многие другие ответы, это как отсоединить работающий процесс, который в настоящее время блокирует оболочку. В большинстве терминалов и оболочек Ctrl kbd> + Z kbd> остановит запущенный процесс и вернет вас к подсказке ввода. Затем вы можете выполнить
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
Как вы указали, вы можете запустить
nohup nm-applet &
, чтобы игнорировать сигнал завершения при закрытии терминала. С этим проблем нет.
Я могу порекомендовать терминал Бёбу. Вы можете легко отменить процесс, нажав клавишу F6.
Хотя есть хорошие ответы выше, я хотел бы дать свои 2 цента о том, как я использую MATLAB в фоновом режиме.
sudo -b matlab
Тег -b
sudo может запускать приложения в фоновом режиме. Вы также можете закрыть терминал после выполнения этой команды.
Возможно, это не связано, но есть замечательный веб-сайт, который вы можете использовать для объяснения команд оболочки. http://explainshell.com/explain/8/sudo
Я не знаю, как это правильно, но я просто начинаю другой сеанс, оставляя предыдущий все. Например, я запустил простой веб-сервер на моей малине. web.py один. затем я начинаю новый сеанс, оставляя его в покое. вот и все. это также очень полезно, так как вы все еще обновляетесь, даже если вы работаете в другой сессии.
В случае использования KDE, вы также можете использовать kstart
, который запустит вашу программу без подключения к терминалу. Это также гарантирует, что среда KDE правильно настроена для команды. (См. Исходный код kstart.cpp
для справки . Как вы видите, он использует KProcess::startDetached
, а KProcess
является производным от QProcess
и запускается startDetached
новый процесс и отрывается от него.)
Похоже также kde-open
или xdg-open
или gnome-open
.