Na área de trabalho com o Bash, devo usar '&', nohup, disown ou alguma combinação dos três para iniciar um processo e executá-lo completamente sozinho?

4

Quando executo esses quatro comandos no Xubuntu 16.04, localmente ou por ssh, todos parecem fazer exatamente a mesma coisa:

export DISPLAY=:0.0 #not necessary unless you have logged in over ssh instead of starting a terminal locally
  1. gedit &
    
  2. gedit & disown
    
  3. nohup gedit
    
  4. nohup gedit & disown
    

Eu não entendo a diferença entre gedit & e gedit & disown porque se eu matar o terminal pai ou sair de uma sessão ssh, pareceria que o gedit é "deserdado" em qualquer cenário.

Quanto aos dois e três, a única diferença que vejo é que a saída do comando é registrada em um arquivo separado e continuará sendo registrada nesse log separado mesmo que a sessão original do shell que gerou o processo bg seja eliminada. / p>

Quanto aos três e quatro, eu continuo lendo que há uma diferença técnica, mas não consigo entender por que você preferiria um ao outro.

Qual deles eu devo usar? Eu vi todos os quatro comandos usados em tutoriais e Q & As, e apesar de algumas ótimas respostas descrevendo as diferenças técnicas entre nohup e disown, não consigo parecer para obter uma recomendação clara (exceto talvez para fins de registro ou compatibilidade de shell) para qual devo usar.

    
por Harold Fischer 11.03.2018 / 02:28

3 respostas

4

Tudo ficará claro quando você tentar realizar algo. Atualmente seu objetivo é "apenas seguir vários tutoriais", então você está basicamente à mercê de vários autores e seus caprichos.

Quando eu precisar executar um script que será executado por um longo tempo e estou em uma sessão ssh, quero:

  1. A tarefa deve continuar mesmo quando a rede quebrar ou quando eu arrumar meu laptop e ir embora.

    a. A tarefa pode terminar sem entrada interativa de mim.

     nohup do_my_stuff &
    

    b. A tarefa pode precisar de algo de mim no stdin.

     man screen
     history -w
     screen
     do_my_stuff
    
  2. O processo em segundo plano está, de alguma forma, melhorando minha sessão atual e deve morrer junto com a sessão. Uma raridade.

     enhance_my_session  >>/tmp/enhance.$$.log 2>&1 &
    
  3. Eu quero que a coisa cuspa alguns logs aleatoriamente na minha sessão ssh. Espere o que? Não, eu nunca iria querer isso. Obrigado disown .

  4. Outra coisa que eu nunca quero: converta o processo em um daemon totalmente desanexado, mas evite iniciá-lo automaticamente na próxima inicialização. Eu nunca iria querer isso porque não posso prever quando o sistema será reiniciado e quem estará reinicializando-o.

Algo quebra? Estes já não servem minhas necessidades? Google. Existe um oceano de possibilidades, você não pode saber tudo.

    
por 11.03.2018 / 08:43
1

Normalmente, faço o seguinte:

  1. myprog & se eu quiser executar algo em segundo plano a partir do meu shell de login atual. Isso é adequado para mim 99% do tempo ...

  2. nohup myprog > /my/path/output.txt & se eu iniciar algo do shell, mas quiser sair depois (talvez enquanto a tarefa em segundo plano ainda estiver em execução).

por 11.03.2018 / 07:28
0

Você deve distinguir ao sair do shell de abortar o terminal.

  1. O shell elimina todos os jobs conhecidos (mas não seus filhos) quando recebe um sinal de interrupção.
  2. O terminal mata tudo o que era o terminal de controle.

Em geral, a melhor solução (no nível do usuário) IMHO é screen .

Se a sua tarefa for mais relacionada ao sistema do que a relacionada ao usuário, você poderá torná-la um serviço systemd em vez de ser iniciado manualmente.

    
por 30.03.2018 / 18:58

Tags