Запуск программ в фоновом режиме из терминала
Как запустить программу в фоновом режиме оболочки с возможностью закрытия оболочки, оставляя программу работающей? Допустим, у моего интерфейса проблемы или по какой-то причине мне нужно загрузить программу из окна терминала, скажем, nm-applet
:
nm-applet
Когда он запущен, он занимает передний план окна терминала.
Есть ли какой-нибудь простой способ запустить программу в фоновом режиме, не оставляя терминал открытым или он занимает весь терминал?
На этой ноте я нашел способ запускать программы из терминала и разрешать ему другие входы, добавляя амперсанд (&
) к команде как таковой:
nm-applet &
Но это не очень полезно, так как любые процессы, запущенные в терминале, уничтожаются после закрытия терминала.
10 ответов
Я недавно полюбил 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 (Hang UP) на работающий внутри bash, который, в свою очередь, отправит сигнал HUP всем его дочерним элементам (именно поэтому nohup работает в этом случае).
Вместо этого выйдите из оболочки, запустив exit
или нажав Ctrl+D. После этого bash откажется от своих потомков и выйдет, оставив фоновые процессы все еще работающими. И когда bash завершает работу, терминал теряет свой дочерний процесс, поэтому он также закрывается.
Делать все это сразу:
nm-applet & exit
Как вы указали, вы можете запустить
nohup nm-applet &
игнорировать сигнал окончания при закрытии терминала. Нет проблем с этим.
Одна вещь, которую пропускают многие другие ответы, это как отсоединить работающий процесс, который в настоящее время блокирует оболочку. В большинстве терминалов и оболочек Ctrl+Z останавливает запущенный процесс и возвращает вас к приглашению ввода. Затем вы можете выдать
bg
отправить запущенный процесс в фоновом режиме. вопрос
fg
вместо этого, чтобы поставить запущенный процесс обратно на передний план.
РЕДАКТИРОВАТЬ: более подробно в этом ответе я обнаружил позже.
Использование (exec PROGRAM &> /dev/null & )
чтобы позволить PID subshell быть принятым PROGRAM
, Я проверял этот подход несколько раз с несколькими различными программами. Закрытие исходного терминала не влияет на вновь созданную программу
Небольшая демонстрация:
$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working
Я могу рекомендовать терминал Бёбу. Вы можете легко отменить процесс, нажав клавишу F6.
Хотя есть хорошие ответы выше, я хотел бы дать свои 2 цента о том, как я использую MATLAB в фоновом режиме.
sudo -b matlab
-b
тег sudo может запускать приложения в фоновом режиме. Вы также можете закрыть терминал после выполнения этой команды.
Возможно, это не связано, но есть замечательный сайт, который вы можете использовать для объяснения команд оболочки. http://explainshell.com/explain/8/sudo
Современный и простой в использовании подход, который позволяет управлять несколькими процессами и имеет приятный пользовательский интерфейс терминала, бесполезен .
Установить с помощью
pip install hapless
(или же
python3 -m pip install hapless
) и просто беги
$ hap run my-command # e.g. hap run python my_long_running_script.py
$ hap status # check all the launched processes
См. документы для получения дополнительной информации.
ПРИМЕЧАНИЕ . Я являюсь автором этого пакета.
В случае использования KDE, вы также можете использовать kstart
, которая запустит вашу программу отдельно от терминала. Это также гарантирует, что среда KDE правильно настроена для команды.
(Увидеть kstart.cpp
Исходный код для справки. Как вы видите, он использует KProcess::startDetached
, а также KProcess
происходит от QProcess
, а также startDetached
запускает новый процесс и отсоединяется от него.)
Похоже также kde-open
или же xdg-open
или же gnome-open
,
Я не знаю, как это правильно, но я просто начинаю другую сессию, оставляя предыдущую полностью. Например, я запустил простой веб-сервер на моей малине. web.py один. затем я начинаю новый сеанс, оставляя его в покое. вот и все. Это также полезно, так как вы все еще обновлены, даже если вы работаете в другой сессии.