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


136

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

nm-applet

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

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

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

nm-applet &

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


7
nohup 'команда' & Кажется, это работает. Есть проблемы с этим?
OVERTONE

Ответы:


173

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

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

Пример:

setsid gnome-calculator

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

gnome-calculator & disown

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

(gnome-calculator &)

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

nohup gnome-calculator

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

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


Оли, в случае DISPLAY =: 0 unity - заменить, что из вышеперечисленного вы бы использовали и почему?
Сумасшедший о Natty

4
@nuttyaboutnatty завернуть всю партию в своей сессии оболочки: sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown. Это в значительной степени мое решение для всего, чтобы убедиться, что оно правильно разветвляется.
Оли

1
@nuttyaboutnatty Это то, что я имею в виду, но у вас не получится запустить два экземпляра, потому --replaceчто он работает так , как это звучит, и фактически завершает старый экземпляр. Второй запуск изнутри xsession приведет к завершению копии, привязанной к TTYn, и позволит вам использовать ее в будущем, если она вам понадобится. Возможно, есть лучший способ сделать это, но только то, что приходит мне в голову каждый раз, когда мне это нужно.
Оли

1
Отлично, тот, который работал для меня, был подоболочкой «(gnome-calculator &)». Я использую его для запуска моно консольного приложения в фоновом режиме. С другими методами моно приложение мгновенно зависнет.
Николаос Георгиу

2
Примечание для будущих пользователей : создание nohup.outможно запретить, перенаправив как stdout, так и sterr /dev/nullтак:nohup firefox &> /dev/null &
Сергей Колодяжный

55

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

Из терминала беги

nm-applet &

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

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

Делать все это сразу:

nm-applet & exit

Это восхитительно! Никогда не знал, и вы, кажется, единственный человек, чтобы упомянуть об этом. Безусловно, это мой любимый подход в среде рабочего стола. Жаль, что я не могу больше голосовать; p
7hi4g0

Я попробовал это с другим приложением, и это не удалось: matlab & exitЗапуск двух отдельных команд работал хорошо:matlab & exit
MattKelly

Мне было интересно, почему OP сказал, что закрытие терминала вызвало сбой его фоновых программ. Я никогда не пытался закрыть терминал кнопкой "x" в окне.
user1717828

кнопка x - это kill, она не завершается чисто, команда exit делает. вместо этого вы можете переназначить кнопку x на команду выхода ...
Тим Бейкер

14

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

nohup nm-applet &  

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


Есть ли другие альтернативы? Просто ради знаний, а не для чего-либо еще
OVERTONE

В Википедии ( en.wikipedia.org/wiki/Nohup ) есть предложение использовать, но echo command | at nowя не смог заставить его работать.
Desgua

2
Интересно, как это работает с пользовательским интерфейсом, когда вы дважды щелкаете значок или программу.
OVERTONE

execпредоставляет альтернативу nohup <command> &для запуска процесса в фоновом режиме и возврата текущего приглашения оболочки.
JSStuball

12

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

bg

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

fg

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

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


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

Хммм (exec firefox)вешает терминал, пока я не выхожу из Firefox ... и закрываю терминал SIGHUPs оболочкой и подоболочкой
kos

Я отредактировал свой ответ. Протестировал это с несколькими другими программами. В этой версии я не наблюдал, как firefox или другая программа вешала управляющий терминал
Сергей Колодяжный,

хорошо работает для меня
Zanna

Я не верю, что использование exec bash необходимо, возможно, вам нужен PID по какой-то причине.
Маринара

2

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


1

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

sudo -b matlab

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

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


0

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


2
Добро пожаловать в Спросите Ubuntu! Я рекомендую отредактировать этот ответ, чтобы расширить его конкретными сведениями о том, как это сделать. (См. Также Как написать хороший ответ? Для общего совета о том, какие ответы считаются наиболее ценными в Ask Ubuntu.)
Дэвид Фёрстер

0

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

Похоже также kde-openили xdg-openили gnome-open.


В таком виде это выглядит почти как комментарий, а не как ответ. Пожалуйста, измените, чтобы расширить. Не просто дать один вкладыш; объясните, почему вы правы, в идеале с цитатами. Ответы без объяснения подлежат удалению.
anonymous2
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.