Как запустить программу в фоновом режиме оболочки с возможностью закрытия оболочки, оставляя программу работающей? Допустим, у моего пользовательского интерфейса проблемы или по какой-то причине мне нужно загрузить программу из окна терминала, скажем, так nm-applet
:
nm-applet
Когда он запущен, он занимает передний план окна терминала.
Есть ли какой-нибудь простой способ запустить программу в фоновом режиме, не оставляя терминал открытым или он занимает весь терминал?
На этой ноте я нашел способ запускать программы из терминала и разрешать ему другие входные данные, добавляя в команду амперсанд ( &
) следующим образом:
nm-applet &
Но это не очень полезно, так как любые процессы, запущенные в терминале, уничтожаются после закрытия терминала.
источник
Ответы:
Я недавно пришел, чтобы понравиться
setsid
. Он начинается с того, что вы просто запускаете что-то из терминала, но вы можете отключить (закрыть терминал), и он просто продолжает работать.Это потому, что команда на самом деле разветвляется, и хотя вход поступает на текущий терминал, он принадлежит совершенно другому родительскому элементу (который остается активным после закрытия терминала).
Пример:
Я также весьма неравнодушен к тому,
disown
что можно использовать для отделения процесса от текущего дерева. Вы используете его в сочетании с фоновым амперсандом:Я также только что узнал о порождении подоболочек с круглыми скобками. Этот простой метод работает:
И, конечно,
nohup
как вы упомянули. Я не в восторге,nohup
потому что у него есть тенденция писать~/nohup.out
без моего ведома. Если вы полагаетесь на это, это может быть для вас.А для более долгосрочных процессов существуют такие вещи, как
screen
и другие виртуальные терминальные мультиплексоры, которые поддерживают сеансы между соединениями. Это, вероятно, на самом деле не относится к вам, потому что вы просто хотите получить временный доступ к выходу терминала, но если вы хотите вернуться через некоторое время позже и просмотреть последние действия терминала, экран, вероятно, будет вашим лучшим выбором.Интернет полон
screen
учебников, но вот простой краткий старт:источник
sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown
. Это в значительной степени мое решение для всего, чтобы убедиться, что оно правильно разветвляется.--replace
что он работает так , как это звучит, и фактически завершает старый экземпляр. Второй запуск изнутри xsession приведет к завершению копии, привязанной к TTYn, и позволит вам использовать ее в будущем, если она вам понадобится. Возможно, есть лучший способ сделать это, но только то, что приходит мне в голову каждый раз, когда мне это нужно.nohup.out
можно запретить, перенаправив как stdout, так и sterr/dev/null
так:nohup firefox &> /dev/null &
Вот два пути, по которым я бы пошел. Во-первых, не запускать его из терминала; нажмите Alt+, F2чтобы открыть диалоговое окно запуска, и запустите его оттуда (без &).
Из терминала беги
Но НЕ закрывайте терминал самостоятельно. То есть, не нажимайте кнопку X, чтобы закрыть, и не используйте File -> Exit из его меню. Если вы закроете терминал таким образом, он отправит сигнал HUP (Hang UP) на работающий внутри bash, который, в свою очередь, отправит сигнал HUP всем его дочерним элементам (именно поэтому nohup работает в этом случае).
Вместо этого выйдите из оболочки, запустив
exit
или нажав Ctrl+ D. После этого bash откажется от своих потомков и выйдет, оставив фоновые процессы все еще работающими. И когда bash завершает работу, терминал теряет свой дочерний процесс, поэтому он также закрывается.Делать все это сразу:
источник
matlab & exit
Запуск двух отдельных команд работал хорошо:matlab &
exit
Как вы указали, вы можете запустить
игнорировать сигнал окончания при закрытии терминала. Нет проблем с этим.
источник
echo command | at now
я не смог заставить его работать.exec
предоставляет альтернативуnohup <command> &
для запуска процесса в фоновом режиме и возврата текущего приглашения оболочки.Одна вещь, которую пропускают многие другие ответы, это как отсоединить работающий процесс, который в настоящее время блокирует оболочку. В большинстве терминалов и оболочек Ctrl+ Zостановит рабочий процесс и вернет вас к приглашению ввода. Затем вы можете выдать
отправить запущенный процесс в фоновом режиме. вопрос
вместо этого, чтобы поставить запущенный процесс обратно на передний план.
РЕДАКТИРОВАТЬ : более подробно в этом ответе я обнаружил позже.
источник
Используется
(exec PROGRAM &> /dev/null & )
для разрешения перехода PID подоболочкиPROGRAM
. Я проверял этот подход несколько раз с несколькими различными программами. Закрытие исходного терминала не влияет на вновь созданную программуНебольшая демонстрация:
источник
(exec firefox)
вешает терминал, пока я не выхожу из Firefox ... и закрываю терминал SIGHUPs оболочкой и подоболочкойЯ могу рекомендовать терминал Бёбу. Вы можете легко отменить процесс, нажав клавишу F6.
источник
Хотя есть хорошие ответы выше, я хотел бы дать свои 2 цента о том, как я использую 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
.источник