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

Как запустить программу в фоновом режиме оболочки с возможностью закрытия оболочки, оставляя программу работающей? Допустим, у моего интерфейса проблемы или по какой-то причине мне нужно загрузить программу из окна терминала, скажем, 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 один. затем я начинаю новый сеанс, оставляя его в покое. вот и все. Это также полезно, так как вы все еще обновлены, даже если вы работаете в другой сессии.

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