sh -c em segundo plano

0

Versão original:

Como executar sudo sh -c "comando" no back ground

Em um terminal

sudo sh -c "comando" & começa em segundo plano, mas assim que eu pressiono enter, o processo sai

[test@localhost app]$ sudo sh -c 'app start' &                        
[3] 31725 

[test@locahost app]$

[3]+  Stopped                 sudo sh -c 'app start'

Reescreva:

Eu quero rodar some long-running command em segundo plano, como root. A maneira “óbvia” de fazer isso é

sudo some long-running command &

Por motivos não especificados, também tentei

sudo sh -c 'some long-running command' &

Ambos falham da mesma maneira: recebo um prompt de shell, mas assim que clico em Enter , recebo uma mensagem de erro:

$ sudo sh -c 'some long-running command' &
 [3] 31725

$

[3]+ Stopped sudo sh -c 'some long-running command'
$ 

Foi apontado para mim que, quando eu coloco o comando sudo em segundo plano, perde o acesso à entrada padrão. Portanto, ele não pode ler a senha e é interrompido quando tenta.

Outra abordagem é usar a opção -b para informar sudo para colocar o long-running command em segundo plano, em vez de colocar sudo em segundo plano:

sudo -b some long-running command

ou

sudo -b sh -c 'some long-running command'

Oh! Eu quase me esqueci de mencionar! Meus requisitos incluem

  • Deve ser capaz de redirecionar a saída do long-running command para um arquivo.
  • Deve ser capaz de capturar o status de saída do long-running command , presumivelmente escrevendo em um arquivo.
  • Deve ser capaz de obter o PID do processo de segundo plano de alguma maneira confiável (sem precisar grep através da saída de ps ).

Como posso fazer isso?

    
por Srikan 31.03.2015 / 08:09

2 respostas

1
  1. Antes de mais nada, o processo não sai; ele pára. Existe uma diferença.
  2. Em segundo lugar, provavelmente acontece imediatamente; você simplesmente não é notificado até depois de pressionar Enter .
  3. Terceiro, quando você coloca um comando no plano de fundo (com & ), coloca a entrada padrão em um estado especial então os processos em segundo plano não podem ler do teclado. Quando você coloca sudo em segundo plano, ele não consegue ler a senha, e assim fica parado.
  4. Corrija isso dizendo sudo para colocar o comando em segundo plano (ao invés de dizer ao seu shell de login para colocar sudo em segundo plano):

    sudo -b sh -c 'app start'
    
  5. Para um comando simples como "início do aplicativo", não há necessidade óbvia de sh -c . Experimente

    sudo -b 'app start'
    

P.S. Esta questão realmente não tem nada a ver com sh -c . Você teria o mesmo problema com algo como

sudo sleep 42 &
    
por 31.03.2015 / 08:31
0

Aqui estão algumas abordagens:

sudo sh -c '(some long-running command > out.txt; echo $? > ret.txt)& echo $!'

e

sudo -b sh -c 'echo $$ > pid.txt; some long-running command > out.txt; echo $? > ret.txt'

Uma abordagem ligeiramente mais complicada:

sudo sleep 0
sudo sh -c 'echo $$ > pid.txt; some long-running command > out.txt; echo $? > ret.txt' &

em que sudo sleep 0 solicita sua senha e armazena suas credenciais em cache então o próximo comando sudo pode prosseguir sem pedir sua senha.

Todos eles fornecem o PID do processo sh -c em vez do processo long-running command .

    
por 01.04.2015 / 07:25

Tags