Qual é a vida de um loop infinito enviado para o segundo plano?

4

Quando um loop infinito terminará?

Por exemplo se eu correr

while :; do sleep 1; date +%s; done &

quando isso terminará - ao fechar o terminal ou ao desligar?

    
por totti 31.01.2013 / 11:37

2 respostas

5

Quando você fornece & no final, ele entra em segundo plano. Se é ou não morto, depende de como você fecha o terminal.

Se você fechar a própria aplicação do terminal ( Ctrl + F4 , pressione x na decoração da janela, ou Shift + Ctrl + W para gnome-terminal ), mata o processo em segundo plano.

Mas se você fechar o terminal usando exit ou Ctrl + D , ele continuará a ser executado, mesmo que você efetue logout (a menos que seja um aplicativo GUI) . Isso terminará quando você desligar.

(Eu não sei porque há uma diferença entre os dois. Eu suspeito que quando você fecha o aplicativo, o sistema operacional o fecha e seus filhos.)

O seguinte é diferente:

nohup while :; do sleep 1; date +%s; done &

O comando nohup desconecta-o do terminal. No entanto, você fecha o terminal, o comando continuará a ser executado até que você desligue (o logoff não seja suficiente) ou mate o comando manualmente.

Quando você usa nohup , a saída vai para ~/nohup.out , a menos que você redirecione manualmente a saída.

P.S. O comando não funcionará com nohup dado, porque nohup não aceita um comando composto. Mas você poderia fazer o script e executar o script com nohup .

P.P.S. É mais fácil ver o que está acontecendo, executando uma GUI. Em vez do comando while …, eu corro isto:

gcalctool &

Muito mais rápido e fácil de ver o que está acontecendo, já que a calculadora desaparece quando é morta; e você pode matá-lo facilmente (basta fechar a calculadora).

    
por Paddy Landau 31.01.2013 / 12:20
2

Se você fornecer & a no final, o fechamento do terminal não encerrará o processo. Ainda pode ser morto por um sinal TERM ou KILL, no entanto. No desligamento, TERM e KILL são enviados para todos os processos.

    
por choroba 31.01.2013 / 11:44

Tags