Выполнение программ в фоновом режиме с терминала

124

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

nm-applet

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

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

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

nm-applet &

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

задан OVERTONE 22.02.2012 в 00:07
источник

8 ответов

157

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

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

Пример:

setsid gnome-calculator

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

gnome-calculator & disown

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

(gnome-calculator &)

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

nohup gnome-calculator

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

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

ответ дан Oli 22.02.2012 в 00:41
источник
47

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

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

nm-applet &

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

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

Выполняя все это сразу:

nm-applet & exit
    
ответ дан geirha 23.02.2012 в 11:45
13

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

nohup nm-applet &  

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

    
ответ дан desgua 22.02.2012 в 00:17
10

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

bg

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

fg

вместо этого перевести текущий процесс на передний план.

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

    
ответ дан krlmlr 31.03.2015 в 14:37
7

Используйте (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
    
ответ дан Sergiy Kolodyazhnyy 30.11.2015 в 11:35
2

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

    
ответ дан speter 05.03.2013 в 00:07
1

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

sudo -b matlab

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

Возможно, несвязанный, но есть замечательный сайт, который вы можете использовать для объяснения команд оболочки. Ссылка

    
ответ дан user3342981 28.06.2016 в 14:39
0

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

    
ответ дан leo 05.07.2016 в 22:15

Ознакомьтесь с другими вопросами по меткам