O que acontece com os trabalhos em segundo plano após sair do shell?

O que acontece com os trabalhos em segundo plano após sair do shell?

Do meu entendimento,empregos são pipelinesiniciado a partir de um determinado shell e você pode gerenciar esses trabalhos ( fg, bg, Ctrl-Z) a partir deste shell. Um trabalho pode consistir em vários processos/comandos.

Minha pergunta é o que acontece com esses trabalhos quando o shell original contendo sai? Suponha que o huponexit não esteja configurado para que os processos em segundo plano continuem em execução após a saída do shell.

Suponha que eu tenha feito:

$ run.sh | grep 'abc' &
[1] job_id

Então eu saio deste shell. Vou entrar em um novo shell e executar, jobsobviamente, e não verei nada. Mas posso fazer ps aux | grep run.she ver esse processo em execução e também farei ps aux | grep grepe verei o processo em grep 'abc'execução.

Existe uma maneira de obter apenas o ID do trabalho do pipeline completo para que eu possa eliminá-lo de uma só vez ou preciso encerrar todos os processos separadamente de outro shell depois de sair do shell original? (Eu tentei o último e funciona, mas parece um incômodo acompanhar todos os processos.)

Responder1

Quando o shell é encerrado, ele pode enviar o sinal HUP para trabalhos em segundo plano e isso pode fazer com que eles sejam encerrados. O sinal SIGHUP só é enviado se o próprio shell receber um SIGHUP, ou seja, somente se o terminal for embora (por exemplo, porque o processo do emulador de terminal morre) e não se você sair do shell normalmente (com o exitbuiltin ou digitando Ctrl+ D). VerEm quais casos o SIGHUP não é enviado para um trabalho quando você sai?eExiste alguma variante do UNIX na qual um processo filho morre com seu pai?para mais detalhes. No bash, você pode definir a huponexitopção de também enviar SIGHUP para trabalhos em segundo plano em uma saída normal. Em ksh, bash e zsh, chamar disownum trabalho o remove da lista de trabalhos para os quais enviar SIGHUP. Um processo que recebe SIGHUP pode ignorar ou captar o sinal e então não morrer. Usar nohupquando você executa um programa o torna imune ao SIGHUP.

Se o processo não for eliminado devido a um possível SIGHUP, ele permanecerá para trás. Não há mais nada para relacioná-lo aos números dos trabalhos no shell.

O processo ainda pode morrer se tentar acessar o terminal, mas o terminal não existir mais. Isso depende de como o programa reage a um terminal inexistente.

Se o trabalho contiver vários processos (por exemplo, um pipeline), todos esses processos estarão em umgrupo de processos. Os grupos de processos foram inventados precisamente para capturar a noção de um shell job composto de vários processos relacionados. Você pode ver os processos agrupados por grupo de processos exibindo seu ID de grupo de processos (PGID — normalmente o ID do primeiro processo do grupo), por exemplo, no ps lLinux ou algo como ps -o pid,pgid,tty,etime,commportável.

Você pode eliminar todos os processos de um grupo passando um argumento negativo para kill. Por exemplo, se você determinou que o PGID do pipeline que deseja eliminar é 1234, poderá eliminá-lo com

kill -TERM -1234

Responder2

Em geral eles ainda rodam, mas você deve usar nohup, se você esqueceu ou mudou de ideia use disown.

mike@mike-laptop4:~$ sleep 500
^Z
[1]+  Stopped                 sleep 500
mike@mike-laptop4:~$ bg
[1]+ sleep 500 &
mike@mike-laptop4:~$ jobs
[1]+  Running                 sleep 500 &
mike@mike-laptop4:~$ disown %1
mike@mike-laptop4:~$ jobs
mike@mike-laptop4:~$ 

informação relacionada