
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, jobs
obviamente, e não verei nada. Mas posso fazer ps aux | grep run.sh
e ver esse processo em execução e também farei ps aux | grep grep
e 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 exit
builtin 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 huponexit
opção de também enviar SIGHUP para trabalhos em segundo plano em uma saída normal. Em ksh, bash e zsh, chamar disown
um 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 nohup
quando 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 l
Linux ou algo como ps -o pid,pgid,tty,etime,comm
portá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:~$