Para onde vão os trabalhos em segundo plano?

5

Do gnome-terminal eu sei a capacidade de suspender um trabalho com C-z e enviá-lo para o segundo plano. Quando fecho o terminal, o processo não termina. Onde o trabalho está sendo gerenciado ou está perdido?

    
por rob.g.greer 18.11.2011 / 20:06

3 respostas

10

Seu trabalho em segundo plano continua em execução até que alguém diga que ele pare, enviando um sinal. Existem várias maneiras de morrer:

  • Quando o terminal desaparece por algum motivo, ele envia um sinal HUP (“hangup”, como no modem hangup ) para o shell executado dentro dele (mais precisamente, para o processo de controle ) e para o processo no grupo de processos em primeiro plano . Um programa em execução em segundo plano não é afetado, mas…
  • Quando o shell recebe esse sinal HUP, ele o propaga para os trabalhos em segundo plano. Então, se o processo em segundo plano não estiver ignorando o sinal, ele morrerá neste ponto.
  • Se o programa tentar ler ou escrever no terminal depois que ele for embora, a leitura ou gravação falhará com um erro de entrada / saída (EIO). O programa pode então decidir sair.
  • Você (ou o administrador do sistema), é claro, pode decidir matar o programa a qualquer momento.

Se sua preocupação é manter o programa em execução, então:

  • Se o programa puder interagir com o terminal, use Tela ou Tmux para executar o programa em um terminal virtual que você pode desconectar e reconectar à vontade.
  • Se o programa precisar continuar em execução e não for interativo, inicie-o com o comando nohup ( nohup myprogram --option somearg ), que garante que o shell não enviará um SIGHUP, redirecionará a entrada padrão para /dev/null e redireciona a saída padrão e o erro padrão para um arquivo chamado nohup.out .
  • Se você já iniciou o programa e não quer que ele morra ao fechar o terminal, execute o disown integrado, se o seu shell tiver um. Se isso não acontecer, você pode evitar a propagação do SIGHUP pelo shell matando o shell com extremo prejuízo ( kill -KILL $$ desse shell, que ignora qualquer trigger de saída que o processo indicado tenha).
  • Se você já iniciou o programa e gostaria de reconectá-lo a outro terminal, existem maneiras, mas não são 100% confiáveis. Veja Como posso deserdar um processo em execução e associá-lo a um novo shell de tela? e perguntas vinculadas.
por 19.11.2011 / 03:18
2

O trabalho pode ser controlado ainda mais enviando sinais apropriados (usando o comando kill , por exemplo).

Você pode tentar isto:

  • execute um comando de longa execução ( yes , por exemplo, já que a saída pode ver que o processo está em execução)
  • pressione Ctrl + Z
  • determine o pid do processo: pgrep yes
  • retomar o processo (equivalente a bg ou fg ) usando: kill -CONT <PID> , em que <PID> é o ID de proces determinado na etapa anterior
por 18.11.2011 / 22:23
0

Quando você pressionar Ctrl + Z você não enviar o processo para o segundo plano, você o coloca em suspensão. Você pode acordar com o comando fg (primeiro plano). Ctrl + Z envia o sinal SIGSTOP (19) para o processo.

Você pode provar isso:

  • Abra dois terminais; em um deles digite este comando yes running , ele irá imprimir 'running''running''running' repetidamente no terminal
  • Pare o processo com Ctrl - Z e procure seu PID com o comando ps .
  • Digite isso no segundo terminal: kill -19 the_previous_PID , você verá que ele produz o mesmo efeito para o processo "sim".

Se você digitar kill -l , verá uma lista de todos os sinais que pode usar.

    
por 19.11.2011 / 11:01