O que está acontecendo depois de matar o -CONT PID?

2

Suspendi um processo por meio de kill -TSTP <pid> . Em seguida, tentei continuar com kill -CONT <pid> . Mas após a conclusão do processo, o controle não está retornando ao bash. Porque isso está acontecendo? E o que fazer para superar esse problema?

Eu iniciei o processo (um shell script) de uma bash (digamos bash-1) com ./name.sh . Em seguida, suspendeu esse processo com o comando kill -TSTP <pid> through bash-2. Finalmente tentei retomar com kill -CONT <pid> através do bash-2. Mas após a conclusão do script de shell, o controle não está retornando, ele fica lá para sempre.

    
por Shamindra Parui 07.04.2016 / 11:21

3 respostas

0

O processo iniciado a partir de um shell tem um TTY de controle associado a eles que herdam do shell e também pertencem a um grupo de processos. Ao executar vários processos em um canal com | ou usando notação subshell com () , todos esses processos são iniciados com o mesmo grupo de processos. Quando o usuário pressiona o pressionamento de tecla suspenso, normalmente Ctrl-Z do teclado, a camada TTY envia o sinal SIGTSTP para todos os processos no grupo de processos atual em primeiro plano e o shell pai é ativado com um SIGCHLD (ou retorna de sua chamada para wait() ) para manipular o TTY novamente. O shell é responsável por controlar qual grupo de processos está em primeiro plano para controlar o TTY e o próprio shell reside em seu próprio grupo de processos.

Se um processo não fizer parte do atual grupo de processos de primeiro plano para o TTY, ele será parado automaticamente pela camada TTY com um SIGTTIN se ele tentar ler do terminal. Por exemplo, enviar SIGCONT para um editor de texto interativo como o vim irá retomá-lo, mas ele receberá imediatamente um SIGTTIN assim que chamar read() para obter o próximo pressionamento de tecla do teclado. O shell deve ser notificado com a diretiva de controle de trabalho fg que deve mover o vim para o grupo de processos em primeiro plano antes de retomar, removendo, assim, o shell de estar em primeiro plano.

    
por 08.09.2017 / 19:03
-1

Você deveria ter parado seu processo com kill -STOP , não kill -TSTP .

O primeiro é projetado para suportar a suspensão / retomada de um processo apenas com sinais, então kill -CONT teria produzido o resultado esperado, enquanto o último ( SIGTSTP ) é mais projetado para suportar o controle do trabalho.

O shell interativo que iniciou seu script parado pode revivê-lo através do comando fg . fg faz coisas extras antes de retomar o processo com SIGCONT . Enviar o sinal sozinho não é suficiente.

    
por 08.04.2016 / 00:40
-1

kill -CONT é algo que não é entendido pelo shell.

Por esse motivo, apenas continua o processo sem nenhum efeito no shell.

Isso resulta em algo semelhante a um processo em segundo plano.

Se você quiser continuar um processo, ligue melhor para fg ou se não é o "trabalho atual", use jobs para listar todos os trabalhos atuais e, em seguida, ligar, e. fg %3 se o trabalho em questão for o trabalho nº3.

Observe que a diferença entre chamar kill -CONT e fg do shell de inicialização é que, com fg , o shell, além de enviar o sinal SIGCONT , define o grupo de processos tty para o grupo de processos do reinício processo. A configuração do grupo de processos tty controla a entrega automatizada dos sinais TSTP , TTIN e TTOU . Mais tarde, o shell começa a esperar pelo comando.

Se você, no entanto, chamou kill -CONT de um shell / tty diferente daquele em que o processo em questão é executado, então deve ser realmente óbvio que você apenas continue com um processo externo. O shell que disparou o kill -CONT apenas retornará ao prompt, mas você verá isso.

    
por 07.04.2016 / 11:43