web-development-kb-pt.site

Como posso matar um segmento específico de um processo?

$ ps -e -T | grep myp | grep -v grep
  797   797 ?        00:00:00 myp
  797   798 ?        00:00:00 myp
  797   799 ?        00:00:00 myp
  797   800 ?        00:00:00 myp

Isso mostra o processo myp com PID = 797 e quatro threads com diferentes SPIDs.

Como posso matar um segmento específico do processo sem matar todo o processo. Entendo que talvez não seja possível em alguns casos quando houver dependências fatais nesse segmento específico. Mas, é possível em qualquer caso? Sim, como?

Eu tentei kill 799 e o próprio processo foi encerrado. Agora não tenho certeza se isso ocorreu porque houve dependências que fizeram myp falhar sem o processo 800 ou porque kill é simples, incapaz de matar processos individuais.

21
Lazer

Threads são parte integrante do processo e não podem ser eliminados fora dele. Existe a função pthread_kill , mas ela se aplica apenas ao contexto do próprio encadeamento. Dos documentos no link:

Observe que pthread_kill () apenas faz com que o sinal seja tratado no contexto do encadeamento especificado; a ação do sinal (término ou parada) afeta o processo como um todo.

26
gvkv

A resposta canônica para essa pergunta é: Com a cooperação do processo, por qualquer mecanismo que ele forneça. Sem a cooperação do processo, é impossível. O fato de o processo consistir em encadeamentos é um detalhe interno do processo que, por design intencional, não é exposto fora do processo.

6
David Schwartz

Além da resposta de @ gkv, você pode dar uma olhada na função pthread_cancel(3), parte de <pthread.h>. Na página do manual:

A função pthread_cancel () envia uma solicitação de cancelamento ao thread do thread. Se e quando o thread de destino reage à solicitação de cancelamento depende de dois atributos que estão sob o controle desse thread: seu estado e tipo de cancelabilidade.

1
Ivan P

Você pode encontrar tgkill () útil. É específico do Linux, como a página de manual menciona.

tgkill () envia o sinal sig para o thread com o ID do thread tid no grupo de threads tgid. (Por outro lado, kill (2) só pode ser usado para enviar um sinal para um processo (ou seja, grupo de encadeamentos) como um todo, e o sinal será entregue a um encadeamento arbitrário nesse processo.)

1
Amit