Программа 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
shell
sudo
background-process
user2534685
источник
источник
sudo boblightd > /dev/null 2>&1 &
dmenu
. Это просто и делает работу довольно хорошо.Ответы:
Команда
[1] 2289
after your background показывает, что она работает и действительно была помещена в фон.Но вывод вашей команды все равно пойдет в терминал, если вы не перенаправите. Вот полный способ сделать это:
Если вы хотите, чтобы и stdout, и stderr использовали один и тот же файл:
И, конечно же, если вас не волнует вывод одного или обоих потоков, вы можете отправить
/dev/null
вместо имени файла.(этот пример отбрасывает стандартный вывод, но сохраняет 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 следующим образом:
это поместит вывод вашей команды в файл nohup.out в текущем каталоге.
Также вы можете использовать команду экрана следующим образом: сначала создайте экран:
затем запустите вашу команду:
Чтобы сохранить экран и вернуться в терминал, введите Ctrl+AD( Ctrl+Aподсказка, для
screen
которой вы хотите что-то сделать, и Dзатем «d» выходит из сеанса, не останавливая его).восстановить ваш экран:
источник
Вам придется перенаправить stdout и stderr на что-то другое, кроме их значений по умолчанию, чтобы скрыть их. Комментарий @ devnull показывает, как это сделать. Это первый шаг.
Если вы просто
&
отключите свою программу, она будет автоматически убита при выходе из системы. Это, вероятно, не то, что вы хотите. Вы должны будете использоватьnohup
команду, чтобы предотвратить это:nohup sudo boblightd > boblight.out 2> boblight.err < /dev/null &
Обратите внимание, что
sudo
, вероятно , будет запрашивать пароль: он не получит, и вы не заметите, что он запрашивает пароль, так как каждый вывод / ввод перенаправляется. В любом случае, у вас есть разные решения для достижения этой цели:sudo
команду раньше,sudo
сохраните ваш пароль. Это быстрый и грязный способ.&
, введитеsudo
пароль, затем отправьте процесс в фоновый режим CTRL + Z.источник
sudo
? Какsudo
получить пароль при запускеnohup
?&
, датьsudo
пароль, а затем отправить процесс в фоновый режимctrl + z
. Вы также можете настроить,sudo
чтобы не запрашивать пароль для этого конкретного пользователя и исполняемой пары.sudo bash
, затем запускаюnohup
команду из новой оболочки.&
фоновый процесс, он будет убит при выходе из системы. Только если bash убит с SIGHUP, он будет тогда SIGHUP вашей программы. Но выход из системы не вызывает SIGHUP. Если вы введетеlogout
или используете CTRL + D, bash выйдет и оставит процесс запущенным. SIGHUP отправляется при закрытии эмулятора терминала в графическом интерфейсе.Boblightd
В случае boblightd вывод, отправленный на stderr, уже записан в его лог-файл (по умолчанию ~ / .boblight / boblightd.log ), поэтому его не нужно фиксировать и его можно отбросить. Кроме того, boblight не работает по умолчанию, но это можно сделать, включив в команду параметр -f .
Я предлагаю вам попробовать следующее:
(подробности из проектной документации )
В более общем смысле
Процессы, запущенные из оболочки, завершатся при выходе из оболочки. Как уже отмечали другие, использование Ctrl-Zво время выполнения процесса на переднем плане возвращает управление оболочке. Тем не менее, процесс находится в остановленном состоянии в этой точке.
bg
Команда будет необходимо , чтобы процесс работает снова , но оставаться в фоновом режиме. Для этого требуется либо идентификатор процесса, либо номер задания (так как обычные номера заданий имеют префикс%), поэтому, используя второй пример, вы можете выполнитьили
Теперь процесс будет выполняться в фоновом режиме, но все еще подключен к оболочке. Ссылка на оболочку может быть разорвана с помощью
disown
команды, которая избавляет от путаницы с nohup / sudo. Как и в случаеbg
,disown
требуется только идентификатор процесса или номер заданиянапример
Теперь вы можете безопасно выйти из оболочки, как если бы вы запустили процесс с помощью
nohup
командыисточник
Поскольку ответ в значительной степени уже изложен в комментарии. Я чувствовал, что было бы хорошо опубликовать небольшое объяснение этого фактического ответа.
Таким образом, путь это:
sudo boblightd > /dev/null 2>&1 &
Здесь есть 3 важные части. Наиболее важным является
&
в конце строки. Это заставляет оболочку не ждать завершения команды, прежде чем вернуть контроль. Также вынимает стандартный ввод с клавиатуры. Это ставит работу на задний план.Но это все равно оставило бы вывод обратно в консоль. Для предотвращения этого существует
>
символ, который перенаправляет стандартный вывод (/dev/null
в данном случае).На этом этапе вы все еще можете получить вывод из вызываемой команды добраться до экрана. Это было бы стандартной ошибкой. Итак, наконец, есть
2>&1
магия. Это перенаправляет вывод из стандартного потока ошибок в стандартный вывод.2
и1
приходят из стандартных файловых дескрипторов.0
будетstdin
,1
- stdout,2
- stderr.Вы можете перенаправить вывод в файл, если вам это нужно.
Есть команды, предназначенные для взаимодействия с заданиями на заднем плане.
jobs
иfg
.Вы также можете играть с более продвинутыми решениями, такими как
screen
команда, если это необходимо.источник