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


9

Програма Boblight не працює у фоновому режимі. Немає помітної різниці між виконанням

sudo boblightd

і

sudo boblightd& 

Як я можу вирішити цю проблему, щоб консоль не блокувала подальші входи?

pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $ sudo boblightd
Boblightd 2.0 (optimized version for raspberry) (c) 2013 Speedy1985 and Heven)
(InitLog)                       start of log /root/.boblight/boblightd.log
(PrintFlags)                    starting boblightd
(CConfig::LoadConfigFromFile)   opening /etc/boblight.conf
(CConfig::CheckConfig)          checking config lines
(CConfig::CheckConfig)          config lines valid
(CConfig::BuildConfig)          building config
(CConfig::BuildConfig)          built config successfully
(main)                          starting devices
(CClientsHandler::Process)      opening listening TcpSocket on *:19333
(CDevice::Process)              ambilight: starting with output "/dev/spidev0.0"
(CDevice::Process)              ambilight: setting up
(CDevice::Process)              ambilight: setup succeeded


pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $ sudo boblightd&
[1] 2289
pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $
Boblightd 2.0 (optimized version for raspberry) (c) 2013 Speedy1985 and Heven)
(InitLog)                       start of log /root/.boblight/boblightd.log
(PrintFlags)                    starting boblightd
(CConfig::LoadConfigFromFile)   opening /etc/boblight.conf
(CConfig::CheckConfig)          checking config lines
(CConfig::CheckConfig)          config lines valid
(CConfig::BuildConfig)          building config
(CConfig::BuildConfig)          built config successfully
(main)                          starting devices
(CClientsHandler::Process)      opening listening TcpSocket on *:19333
(CDevice::Process)              ambilight: starting with output "/dev/spidev0.0"
(CDevice::Process)              ambilight: setting up
(CDevice::Process)              ambilight: setup succeeded

8
Скажи:sudo boblightd > /dev/null 2>&1 &
devnull

Якщо ви цього не робите з метою навчання, тоді використовуйте dmenu. Це просто і робить роботу досить добре.
Нішант

Відповіді:


22

Команда [1] 2289after після тла показує, що вона працювала і була дійсно виведена на другий план.

Але висновок вашої команди все одно піде до терміналу, якщо ви не перенаправитеся. Ось вичерпний спосіб зробити це:

sudo boblightd >std.txt 2>err.txt &

Якщо ви хочете, щоб і stdout, і stderr перейшли до одного файлу:

sudo boblightd >std.txt 2>&1 &

І, звичайно, якщо вам не байдуже висновок одного або обох потоків, ви можете надіслати на /dev/nullім’я замість імені файлу.

sudo boblightd >/dev/null 2>err.txt &

(цей приклад викидає стандартний вихід, але він тримається більш жорстким, на випадок, якщо щось піде не так.)


ОНОВЛЕННЯ

Сказане базується на тому, щоб не знати, що таке boblightd. Я бачу в іншій відповіді, що він має демон-режим, тому його слід використовувати замість цього випадку.

До речі, вищезгадане припускає sudo, що не буде запитувати пароль, і що ви не закриєте вікно терміналу. Для перших, які я особисто зазвичай використовую sudo bashтоді, було б набрати boblightd >std.txt 2>err.txt &. Інший спосіб - виконати sudo lsчи якусь нешкідливу команду, щоб переконатися, що доступ буде кешований.

Для останнього nohup- це магічна команда, щоб переконатися, що вона залишається запущеною навіть після того, як ви покинете будівлю. Це піде після sudoі перед фактичною командою. Напр sudo nohup boblightd >std.txt 2>err.txt &. Або sudo bashтоді nohup boblightd >std.txt 2>err.txt &, тоді exit(щоб залишити кореневу оболонку).


Також важливо зауважити, що якщо sudoспроба запросити пароль, він не вдасться, оскільки фонові процеси не можуть прочитати STDIN.
Патрік

Дякую @Patrick. Я щойно відповів на безпосередню проблему в питанні, але, як це привертає деяку увагу, я оновив згадування про введення пароля та nohup.
Даррен Кук

5

Я думаю, ви можете використовувати команду nohup, як це:

nohup sudo boblightd &

це поставить вихід вашої команди до файлу nohup.out у поточному каталозі.

Також ви можете використовувати екранну команду, як це: спочатку створіть екран:

screen -S your-sreen-name

потім запустіть свою команду:

sudo boblightd

Щоб зберегти екран і повернутися до терміналу, введіть Ctrl+AD( Ctrl+Aє підказкою для того, screenщо ви хочете щось зробити, а Dпотім "d" етапи з сеансу, не зупиняючи його).

відновіть екран:

screen -d -r your-screen-name

4

Вам потрібно буде перенаправити stdout та stderr на щось інше, ніж їхні типові параметри, щоб їх приховати. @ коментар devnull показує, як це зробити. Це перший крок.

Якщо ви просто використовуєте &для від'єднання програми, вона буде автоматично вбита під час виходу. Мабуть, це не те, що ти хочеш. Вам потрібно буде скористатися nohupкомандою, щоб запобігти цьому:

nohup sudo boblightd > boblight.out 2> boblight.err < /dev/null &

Зауважте, що sudo, ймовірно, запитаєте пароль: він не отримає жодного, і ви не помітите, що він просить вас, оскільки кожен вихід / вхід переспрямований. У вас все одно є різні рішення, щоб досягти цього:

  • Запустити sudoкоманду раніше, sudoзбереже ваш пароль. Це швидкий шлях тридцять.
  • Зніміть &, дайте sudoпароль, а потім відправити процес у фоновий режим з CTRL + Z.
  • Також можна налаштувати sudo, щоб не запитувати пароль для цього конкретного користувача та виконуваної пари. Майте на увазі, що це може бути можливим порушенням безпеки ...

Чи краще мати ногуп до після sudo? Як sudoотримати пароль під час запуску nohup?
Аарон Дігулла

1
Ну, це хороший момент: не буде. Тут у вас є кілька рішень: виконайте команду sudo раніше, sudo збереже ваш пароль. Це швидкий шлях тридцять. Ще одним було б видалити &, вказати sudoпароль, а потім відправити процес на другий план ctrl + z. Ви також можете налаштувати sudoне запитувати пароль для цього конкретного користувача та виконуваної пари.

(Я додав це у відповідь.)

Я зазвичай це роблю sudo bash, а потім запускаю nohupкоманду всередині нової оболонки.

Насправді невірно, що якщо ви використовуєте лише &виконувати процес, він буде вбитий під час виходу. Тільки якщо bash буде вбито за допомогою SIGHUP, це SIGHUP ваша програма. Але вихід із системи не спричиняє ВИГОТОВЛЕННЯ. Якщо ви введете logoutабо використовуєте CTRL + D, bash вийде з нього і залишить процес запущеним. SIGHUP надсилається при закритті емулятора терміналу в графічному інтерфейсі.
Патрік

2

Боблайт

У випадку boblightd вихідний сигнал, що надсилається до stderr, вже зафіксований у файлі журналу (за замовчуванням до ~ / .boblight / boblightd.log ), тому це не потрібно захоплювати і може бути відкинуто. Крім того, boblight не розщеплюється за замовчуванням, але це можна зробити, включивши в команду -f .

Пропоную спробувати наступне:

sudo boblightd -f >/dev/null 2>/dev/null

(деталі з проектної документації )

Більш загально

Процеси, розпочаті з оболонки, припиняться, коли оболонка вийде. Як зазначали інші, використання Ctrl-Zпід час запуску процесу на передньому плані повертає контроль до оболонки. Однак процес на цьому етапі знаходиться в зупиненому стані . bg Команда буде необхідно , щоб процес працює знову , але залишатися в фоновому режимі. Для нього потрібен або ідентифікатор процесу, або номер завдання (як звичайні номери завдань з префіксом%), тому, використовуючи другий приклад, ви видасте або

bg %1

або

bg 2289

Зараз процес буде працювати у фоновому режимі, але все ще прикріплений до оболонки. Посилання на оболонку може бути розірвано за допомогою disownкоманди, яка зберігає плутанину з nohup / sudo. Як і у випадку bg, disownпотрібен лише ідентифікатор процесу або номер завдання

напр

disown 2289

Тепер ви можете безпечно вийти з оболонки, як якщо б ви запустили процес за допомогою nohupкоманди


1

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

Тож шлях: sudo boblightd > /dev/null 2>&1 &

Тут є 3 важливі частини. Найголовніше - &в кінці рядка. Це змушує оболонку не чекати, коли команда закінчиться, перш ніж повернути назад контроль. Він також виймає стандартний вхід з клавіатури. Це ставить роботу на другий план.

Але це все одно поверне вихід у консоль. Щоб запобігти цьому, існує >символ, який переспрямовує стандартний вихід (на /dev/nullцей випадок).

У цей момент ви все ще можете отримати вихід з викликаної команди get to screen. Це була б стандартна помилка. Отже, нарешті, є 2>&1магія. Це перенаправляє вихід із стандартного потоку помилок на стандартний вихід.

2і 1походять із стандартних дескрипторів файлів. 0було б stdin, 1- stdout, 2- stderr.

Ви можете перенаправити вихід у файл, якщо він вам потрібен.

Існують команди, призначені для взаємодії із завданнями в основі. jobsі fg.

Ви також можете грати з більш досконалими рішеннями, такими як screenкоманда, якщо потрібно.

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