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


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. Это просто и делает работу довольно хорошо.
Nishant

Ответы:


22

Команда [1] 2289after your background показывает, что она работает и действительно была помещена в фон.

Но вывод вашей команды все равно пойдет в терминал, если вы не перенаправите. Вот полный способ сделать это:

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

Если вы хотите, чтобы и stdout, и stderr использовали один и тот же файл:

sudo boblightd >std.txt 2>&1 &

И, конечно же, если вас не волнует вывод одного или обоих потоков, вы можете отправить /dev/nullвместо имени файла.

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

(этот пример отбрасывает стандартный вывод, но сохраняет stderr, на случай, если что-то пойдет не так.)


ОБНОВИТЬ

Вышесказанное основано на незнании того, что такое 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.
Патрик

Спасибо, Патрик. Я только что ответил на непосредственную проблему в вопросе, но так как это привлекает некоторое внимание, я обновился с упоминанием запроса пароля и 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, чтобы не запрашивать пароль для этого конкретного пользователя и исполняемой пары. Помните, что это может быть возможным нарушением безопасности,…

Это лучше иметь nohup до или после sudo? Как sudoполучить пароль при запуске nohup?
Аарон Дигулла

1
Ну, это хороший момент: это не так. У вас есть несколько решений: выполните команду sudo, sudo сохранит ваш пароль. Это быстрый и грязный способ. Другой способ - удалить &, дать sudoпароль, а затем отправить процесс в фоновый режим ctrl + z. Вы также можете настроить, sudoчтобы не запрашивать пароль для этого конкретного пользователя и исполняемой пары.

(Я добавил это к ответу.)

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

На самом деле неправильно, что если вы используете только &фоновый процесс, он будет убит при выходе из системы. Только если bash убит с SIGHUP, он будет тогда SIGHUP вашей программы. Но выход из системы не вызывает SIGHUP. Если вы введете logoutили используете CTRL + D, bash выйдет и оставит процесс запущенным. SIGHUP отправляется при закрытии эмулятора терминала в графическом интерфейсе.
Патрик

2

Boblightd

В случае 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в данном случае).

На этом этапе вы все еще можете получить вывод из вызываемой команды добраться до экрана. Это было бы стандартной ошибкой. Итак, наконец, есть 2>&1магия. Это перенаправляет вывод из стандартного потока ошибок в стандартный вывод.

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

Вы можете перенаправить вывод в файл, если вам это нужно.

Есть команды, предназначенные для взаимодействия с заданиями на заднем плане. jobsи fg.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.