Como iniciar um programa em segundo plano

9

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
user2534685
fonte
8
Diga:sudo boblightd > /dev/null 2>&1 &
devnull 14/11/13
Se você não estiver fazendo isso para fins de aprendizado, use dmenu. É simples e faz o trabalho muito bem.
Nishant

Respostas:

22

O [1] 2289comando 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:

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

Se você deseja que stdout e stderr sigam para o mesmo arquivo:

sudo boblightd >std.txt 2>&1 &

E, é claro, se você não se importa com a saída de um ou de ambos os fluxos, pode enviar para, em /dev/nullvez de um nome de arquivo.

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

(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 sudoque não solicitará uma senha e que você não fechará a janela do terminal. Para o primeiro, eu pessoalmente normalmente uso sudo bashentão, digitaria boblightd >std.txt 2>err.txt &. Outra maneira é fazer sudo lsou 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 o sudocomando e antes dele. Por exemplo sudo nohup boblightd >std.txt 2>err.txt &. Ou sudo bashentão nohup boblightd >std.txt 2>err.txt &, então exit(para deixar o shell raiz).

Darren Cook
fonte
Também é importante observar que, se sudotentar solicitar a senha, ela falhará porque os processos em segundo plano não podem ler STDIN.
Patrick
Obrigado @Patrick. Acabei de responder sobre o problema imediato na pergunta, mas como isso está recebendo alguma atenção, atualizei com menção de solicitação de senha e nohup.
Darren Cozinhe
5

Eu acho que você pode usar o comando nohup como este:

nohup sudo boblightd &

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:

screen -S your-sreen-name

então execute seu comando:

sudo boblightd

Para salvar a tela e retornar ao terminal, digite Ctrl+AD( Ctrl+Aé a dica para screenque você deseja fazer algo e, em Dseguida, "d" etaches da sessão sem parar).

restaure sua tela:

screen -d -r your-screen-name

fonte
4

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 o nohupcomando para evitar isso:

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

Observe que sudoprovavelmente 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:

  • Execute um sudocomando antes, sudosalvará sua senha. Esse é o caminho mais rápido.
  • Remova o &, forneça sudoa senha e envie o processo para segundo plano CTRL + Z.
  • Também pode configurar o sudo para não solicitar a senha para este usuário específico e casal executável. Esteja ciente de que pode ser uma possível violação de segurança,…
Marc Plano-Lesay
fonte
É melhor tomar o nohup antes de depois do sudo? Como sudoobtém sua senha quando você a executa nohup?
Aaron Digulla
1
Bem, esse é um bom ponto: não vai. Você tem várias soluções aqui: execute um comando sudo antes, o sudo salvará sua senha. Esse é o caminho mais rápido. Outra seria remover &, fornecer sudoa senha e enviar o processo para segundo plano ctrl + z. Você também pode configurar sudopara não solicitar a senha para este usuário específico e casal executável.
(Eu adicionei isso para a resposta.)
Normalmente sudo bash, faço o nohupcomando de dentro do novo shell.
Na verdade, é incorreto que, se você usar apenas &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ê digitar logoutou 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.
Patrick
2

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:

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

(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 emitir

bg %1

ou

bg 2289

O processo agora será executado em segundo plano, mas ainda está anexado ao shell. O link para o shell pode ser cortado usando o disowncomando, que salva a confusão com nohup / sudo. Assim como bg, disownrequer apenas o ID do processo ou o número do trabalho

por exemplo

disown 2289

Agora você pode sair do shell com segurança, como se tivesse executado o processo com o nohupcomando

Chilledrat
fonte
1

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/nullneste 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>&1mágica. Isso redireciona a saída do fluxo de erros padrão para a saída padrão.

2e 1vêm de descritores de arquivo padrão. 0seria stdin, 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. jobse fg.

Você também pode jogar com soluções mais avançadas, como screencomando, se necessário.

luk32
fonte