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


136

Як запустити програму на тлі оболонки, з можливістю закрити оболонку, залишаючи програму запущеною? Скажемо, мій інтерфейс має проблеми або з якоїсь причини мені потрібно завантажувати програму з вікна терміналу, скажімо nm-applet:

nm-applet

Після його запуску він займає передній план вікна терміналу.

Чи є якийсь простий спосіб запустити програму у фоновому режимі, не потрібно залишати термінал відкритим або він займає весь термінал?

У цій примітці я знайшов спосіб запустити програми з терміналу і дав йому можливість використовувати інші входи, додавши &в команду ampersand ( ) як таку:

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 єдність - замініть, що з вищезазначеного ви б використали і чому?
горіх про 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 виходить, термінал втратив дочірній процес, тому він також закриється.

Робити все це відразу:

nm-applet & exit

Це дивовижно! Ніколи про це не знав, і ти, здається, єдина людина, яка згадує про це. Однозначно, це мій улюблений підхід, коли в робочому середовищі. Шкода, що більше не можу подати заяву; p
7hi4g0

Я спробував це з іншим додатком, і це не вдалося. matlab & exitЗапуск, як дві окремі команди працювали добре:matlab & exit
MattKelly

Мені було цікаво, чому ОП заявив, що закриття терміналу спричинило збій його фонових програм. Я ніколи не намагався закрити термінал кнопкою "x" у вікні.
користувач1717828

кнопка x є вбитий, вона не виходить чисто, команда виходу робить. ви можете замінити кнопку x замість команди для виходу натомість ...
Тім Бейкер

14

Як ви вказали, ви можете бігати

nohup nm-applet &  

ігнорувати кінцевий сигнал при закритті терміналу. З цим немає жодних проблем.


Будь-які інші альтернативи? Просто заради знань, а не заради чого іншого
OVERTONE

На wikipedia ( en.wikipedia.org/wiki/Nohup ) є пропозиція використовувати, echo command | at nowяку я не зміг би змусити її працювати.
десгуа

2
Цікаво, як це працює з інтерфейсу користувача, коли ви двічі клацніть піктограму чи програму.
OVERTONE

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

12

Одне, на що не вистачає багатьох інших відповідей, - це від'єднати запущений процес, який наразі блокує оболонку. У більшості терміналів і оболонок Ctrl+ Zзупинить запущений процес і поверне вас до запиту введення. Потім, ви можете видати

bg

щоб відправити запущений процес на другий план. Проблема

fg

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

EDIT : Більш детально у цій відповіді я дізнався пізніше.


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

Hmmm (exec firefox)висить на терміналі, поки я не вийду з Firefox ... і закриваю термінал SIGHUPs оболонки та нижньої оболонки
kos

Я відредагував свою відповідь. Тестували його за допомогою декількох інших програм. Я не спостерігав Firefox або іншої програми, яка вивішувала контрольний термінал в цій версії
Сергій Колодяжний

добре працює для мене
Zanna

Я не вірю, що використання файлу bash є необхідним, можливо, вам потрібен PID з якихось причин.
маринара

2

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


1

Хоча вище є відповіді, я хотів би дати свої 2 центи про те, як я використовую MATLAB у фоновому режимі.

sudo -b matlab

-bТег Sudo може запускати додатки в фоновому режимі. Ви також можете закрити термінал після виконання цієї команди.

Можливо, це не пов'язано, але є чудовий веб-сайт, який ви можете використовувати для пояснення команд оболонки. http://explainshell.com/explain/8/sudo


0

Я не знаю, що це правильний шлях, але я просто починаю ще одну сесію, залишаючи попередній один. Наприклад, я запустив простий веб-сервер на своїй малині. web.py. тоді я починаю новий сеанс, залишаючи його в спокої. Це воно. це також дуже корисно, оскільки ви все ще оновлюєтесь, хоча ви працюєте на іншому сеансі.


2
Ласкаво просимо до Ask Ubuntu! Рекомендую відредагувати цю відповідь, щоб розширити її конкретними деталями про те, як це зробити. (Дивіться також Як я можу написати гарну відповідь? Для загальних порад про те, які типи відповідей вважаються найціннішими на Ask Ubuntu.)
Девід Фоерстер

0

Якщо використовується KDE, ви також можете скористатися kstartпрограмою, яка запустить вашу програму відключеною від терміналу. Він також гарантує, що середовище KDE правильно налаштовано для команди. (Див. kstart.cppВихідний код для посилання . Як ви бачите звідти, він використовує KProcess::startDetachedі KProcessотримує з нього QProcess, і startDetachedзапускає новий процес, і відривається від нього.)

Схожа також kde-openчи xdg-openабо gnome-open.


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