É kill -STOP um comando temporário?

1

Eu tinha pausado 50 processos ( aqui ) usando

kill -STOP

e, em seguida, a janela do shell travou (provavelmente um problema de GUI - eu tinha acabado de pedir ajuda à configuração nas opções de rolagem), e isso pareceu causar a pausa dos 50 processos. (Eu pude pausá-los novamente).

Mas por que a falha do shell causaria a pausa dos processos? Eles não devem permanecer em pausa até que alguém lhes diga para fazer uma pausa?

    
por Andrew Grimm 16.07.2009 / 10:02

1 resposta

5

Como resultado do encerramento do shell, POSIX.1-2008 requer :

If the exit of the process causes a process group to become orphaned, and if any member of the newly-orphaned process group is stopped, then a SIGHUP signal followed by a SIGCONT signal shall be sent to each process in the newly-orphaned process group.

A ação padrão no recebimento do SIGHUP é encerrar o processo. No entanto, dependendo do shell e de como o processo foi iniciado, bem como de qualquer manipulação de sinal configurada pelo próprio processo, o SIGHUP pode ser ignorado pelo processo. Nesse caso, o processo continuará a execução normal.

A suposição é que os processos em um grupo de processos, em execução em um shell de controle de tarefa, serão manipulados por esse shell como um grupo, e não pelo usuário enviando sinais SIGSTOP e SIGCONT diretos. POSIX.1-2008 explica:

...if the termination of a process causes a process group to become orphaned, processes within the group are disconnected from their job control shell, which no longer has any information on the existence of the process group. Stopped processes within the group would languish forever. In order to avoid this problem, newly orphaned process groups that contain stopped processes are sent a SIGHUP signal and a SIGCONT signal to indicate that they have been disconnected from their session. The SIGHUP signal causes the process group members to terminate unless they are catching or ignoring SIGHUP. Under most circumstances, all of the members of the process group are stopped if any of them are stopped.

Um processo poderia evitar esse comportamento ao bifurcar e criar sua própria sessão ( setsid() ), para que deixasse de fazer parte da sessão da shell onde foi iniciada. Ele não seria afetado pelo controle de trabalho dentro do shell, pela terminação do shell ou pelos sinais gerados a partir do terminal.

    
por 16.07.2009 / 12:37

Tags