O programa Boblight não é executado em segundo plano. Não há diferença perceptível entre executar
sudo boblightd
e
sudo boblightd&
Como posso resolver esse problema que o console não bloqueará outras entradas?
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
fonte
fonte
sudo boblightd > /dev/null 2>&1 &
dmenu
. É simples e faz o trabalho muito bem.Respostas:
O
[1] 2289
comando after your background mostra que funcionou e foi realmente colocado em segundo plano.Mas a saída do seu comando ainda irá para o terminal, a menos que você o redirecione. Aqui está a maneira abrangente de fazer isso:
Se você deseja que stdout e stderr sigam para o mesmo arquivo:
E, é claro, se você não se importa com a saída de um ou de ambos os fluxos, pode enviar para, em
/dev/null
vez de um nome de arquivo.(esse exemplo joga fora a saída padrão, mas mantém o stderr, caso algo dê errado.)
ATUALIZAR
O exposto acima não se baseia no que é boblightd. Vejo em outra resposta que ele tem um modo daemon, de modo que deve ser usado nesse caso.
BTW, o acima pressupõe
sudo
que não solicitará uma senha e que você não fechará a janela do terminal. Para o primeiro, eu pessoalmente normalmente usosudo bash
então, digitariaboblightd >std.txt 2>err.txt &
. Outra maneira é fazersudo ls
ou algum comando inofensivo para garantir que o acesso seja armazenado em cache.Para o último,
nohup
é o comando mágico para garantir que ele continue sendo executado mesmo depois de sair do prédio. Iria após osudo
comando e antes dele. Por exemplosudo nohup boblightd >std.txt 2>err.txt &
. Ousudo bash
entãonohup boblightd >std.txt 2>err.txt &
, entãoexit
(para deixar o shell raiz).fonte
sudo
tentar solicitar a senha, ela falhará porque os processos em segundo plano não podem ler STDIN.Eu acho que você pode usar o comando nohup como este:
isso colocará a saída do seu comando no arquivo nohup.out no diretório atual.
Além disso, você pode usar o comando screen como este: primeiro crie uma tela:
então execute seu comando:
Para salvar a tela e retornar ao terminal, digite Ctrl+AD( Ctrl+Aé a dica para
screen
que você deseja fazer algo e, em Dseguida, "d" etaches da sessão sem parar).restaure sua tela:
fonte
Você precisará redirecionar stdout e stderr para outra coisa que não os padrões para ocultá-los. O comentário do @ devnull mostra como fazer isso. Esse é o primeiro passo.
Se você simplesmente
&
desanexar seu programa, ele será eliminado automaticamente quando você sair. Provavelmente não é isso que você deseja. Você precisará usar onohup
comando para evitar isso:nohup sudo boblightd > boblight.out 2> boblight.err < /dev/null &
Observe que
sudo
provavelmente solicitará uma senha: ela não receberá nenhuma e você não notará que está solicitando uma, pois todas as saídas / entradas são redirecionadas. Você tem soluções diferentes para conseguir isso de qualquer maneira:sudo
comando antes,sudo
salvará sua senha. Esse é o caminho mais rápido.&
, forneçasudo
a senha e envie o processo para segundo plano CTRL + Z.fonte
sudo
? Comosudo
obtém sua senha quando você a executanohup
?&
, fornecersudo
a senha e enviar o processo para segundo planoctrl + z
. Você também pode configurarsudo
para não solicitar a senha para este usuário específico e casal executável.sudo bash
, faço onohup
comando de dentro do novo shell.&
o plano de fundo do processo, ele será eliminado no logout. Somente se o bash for morto com um SIGHUP, ele SIGHUP seu programa. Mas o logout não causa um SIGHUP. Se você digitarlogout
ou usar CTRL + D, o bash sairá e deixará o processo em execução. SIGHUP é enviado quando você fecha o emulador de terminal em uma GUI.Boblightd
No caso do boblightd, a saída enviada ao stderr já está capturada em seu arquivo de log (o padrão é ~ / .boblight / boblightd.log ), portanto, isso não precisa ser capturado e pode ser descartado. Além disso, o boblight não se bifurca por padrão, mas pode ser feito incluindo o -f no comando.
Eu sugiro que você tente o seguinte:
(detalhes da documentação do projeto )
De forma geral
Os processos iniciados no shell serão encerrados quando o shell sair. Como outros salientaram, o uso Ctrl-Zdurante a execução de um processo em primeiro plano retorna o controle ao shell. No entanto, o processo é colocado em um estado parado neste momento. O
bg
comando será necessário para que o processo seja executado novamente, mas fique em segundo plano. Ele requer um ID do processo ou o número do trabalho (como os números de trabalho usuais são prefixados com%), portanto, usando o seu segundo exemplo, você pode emitirou
O processo agora será executado em segundo plano, mas ainda está anexado ao shell. O link para o shell pode ser cortado usando o
disown
comando, que salva a confusão com nohup / sudo. Assim comobg
,disown
requer apenas o ID do processo ou o número do trabalhopor exemplo
Agora você pode sair do shell com segurança, como se tivesse executado o processo com o
nohup
comandofonte
Uma vez que a resposta já está bastante definida no comentário. Eu senti que seria bom postar um pouco de explicação sobre isso como uma resposta real.
Portanto, o caminho a seguir é:
sudo boblightd > /dev/null 2>&1 &
Existem 3 partes importantes aqui. O mais importante é
&
no final da linha. Isso faz com que o shell não espere o comando terminar antes de devolver o controle. Também remove a entrada padrão do teclado. Ele coloca o trabalho em segundo plano.Mas isso ainda deixaria a saída de volta no console. Para evitar isso, existe um
>
símbolo que redireciona a saída padrão (/dev/null
neste caso).Nesse ponto, você ainda pode obter a saída do comando chamado get to screen. Este seria o erro padrão. Então, finalmente, há
2>&1
mágica. Isso redireciona a saída do fluxo de erros padrão para a saída padrão.2
e1
vêm de descritores de arquivo padrão.0
seriastdin
,1
- stdout,2
- stderr.Você pode redirecionar a saída para um arquivo, se precisar.
Existem comandos projetados para interagir com trabalhos em segundo plano.
jobs
efg
.Você também pode jogar com soluções mais avançadas, como
screen
comando, se necessário.fonte