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 este problema que o console não bloqueará mais 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
    
por user2534685 14.11.2013 / 08:52

5 respostas

22

O [1] 2289 após seu comando de segundo plano mostra que funcionou e foi, de fato, colocado em segundo plano.

Mas a saída do seu comando ainda irá para o terminal, a menos que você redirecione. Aqui está a maneira abrangente de fazer isso:

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

Se você quer stdout e stderr para ir 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 /dev/null em vez de um nome de arquivo.

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

(esse exemplo joga fora a saída padrão, mas mantém stderr, apenas no caso de algo dar errado.)

UPDATE

O acima é baseado em nenhum conhecimento do que é boblightd. Eu vejo em outra resposta que tem um modo daemon, de modo que deve ser usado em vez disso, neste caso.

BTW, o acima assume que sudo não solicitará uma senha e você não fechará a janela do terminal. No primeiro caso, eu normalmente uso sudo bash , digito boblightd >std.txt 2>err.txt & . Outra maneira é fazer sudo 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 funcionando mesmo depois de você sair do Edifício. Ele iria após o sudo e antes do comando real. Por exemplo. %código%. Ou sudo nohup boblightd >std.txt 2>err.txt & then sudo bash e, em seguida, nohup boblightd >std.txt 2>err.txt & (para deixar o shell da raiz).

    
por 14.11.2013 / 09:12
4

Eu acho que você pode usar o comando nohup assim:

nohup sudo boblightd &

isto 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

execute o seu comando:

sudo boblightd

Para salvar a tela e retornar ao terminal, digite Ctrl + A D ( Ctrl + A é a dica para screen que você quer fazer algo e D então "d" etaches da sessão sem pará-lo).

restaure sua tela:

screen -d -r your-screen-name
    
por 14.11.2013 / 09:19
4

Você terá que redirecionar stdout e stderr para algo diferente de seus padrões para ocultá-los. @ devnull's comment mostra como fazer isso. Esse é o primeiro passo.

Se você simplesmente usar & para desanexar seu programa, ele será eliminado automaticamente quando você sair. Isso provavelmente não é o que você quer. Você terá que usar o comando nohup para evitar isso:

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

Observe que sudo provavelmente pedirá uma senha: ela não será exibida, e você não notará que ela está pedindo uma, já que todas as saídas / entradas são redirecionadas. Você tem diferentes soluções para conseguir isso de qualquer maneira:

  • Execute um comando sudo antes, sudo salvará sua senha. Essa é a maneira rápida e sem graça.
  • Remova o & , forneça sudo da senha e envie o processo para o plano de fundo com CTRL + Z .
  • Também é possível configurar o sudo para não solicitar a senha desse usuário específico e par executável. Esteja ciente de que pode ser uma possível violação de segurança,…
por 14.11.2013 / 09:19
2

Boblightd

No caso de boblightd , a saída enviada para stderr já é capturada em seu arquivo de log (o padrão é ~ / .boblight / boblightd.log ), então isso não não precisa ser capturado e pode ser descartado. Além disso, o boblight não bifurca por padrão, mas pode ser feito para incluir o -f no comando.

Sugiro que tente o seguinte:

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

(detalhes da documentação do projeto )

Mais geralmente

Os processos iniciados a partir do shell serão encerrados quando o shell sair. Como outros apontaram usando Ctrl-Z enquanto executava um processo no primeiro plano retorna o controle para o shell. No entanto, o processo é colocado em um estado parado neste momento. O comando bg será necessário para que o processo volte a ser executado, mas permaneça em segundo plano. Ele requer um ID de processo ou o número do trabalho (como os números de trabalho normais são prefixados com um%), então, usando seu segundo exemplo, você deve emitir

bg %1

ou

bg 2289

O processo será executado em segundo plano, mas ainda estará anexado ao shell. O link para o shell pode ser separado usando o comando disown , o que economiza a confusão com nohup / sudo. Assim como com bg , disown requer 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 comando nohup

    
por 14.11.2013 / 12:39
1

Desde que a resposta já está bem definida no comentário. Eu senti que seria bom postar um pouco de explicação sobre isso como uma resposta real.

Então, o caminho a percorrer é: 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 retornar o controle. Também tira a entrada padrão do teclado. Coloca o trabalho em segundo plano.

Mas isso ainda deixaria a saída de volta ao console. Para evitar isso, há o símbolo > que redireciona a saída padrão (para /dev/null neste caso).

Neste ponto, você ainda pode obter a saída do comando chamado get to screen. Este seria o erro padrão. Então, por último, há 2>&1 magic. Isso redireciona a saída do fluxo de erro padrão para a saída padrão.

2 e 1 são provenientes de descritores de arquivos padrão. 0 seria stdin , 1 - stdout, 2 - stderr.

Você pode redirecionar a saída para um arquivo, se precisar.

Existem comandos projetados para interagir com trabalhos no back ground. jobs e fg .

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

    
por 14.11.2013 / 09:18