Para cenários de teste de catástrofe no ambiente de servidor externo, estamos procurando uma maneira fácil de manter um processo parado no estado D (suspensão ininterrupta).
Alguma maneira fácil? Um exemplo de código de exemplo C seria uma vantagem :)
Editar - a primeira resposta é semi-correta, pois o processo é mostrado no estado D, mas ainda recebe sinais e pode ser eliminado
process
process-management
benchmark
er453r
fonte
fonte
Respostas:
Eu tive o mesmo problema e resolvi criando um módulo do kernel que fica preso no estado D.
Como não tenho experiência em módulos, peguei o código desse histórico com algumas modificações encontradas em algum lugar .
O resultado é um dispositivo em / dev / memory que fica preso na leitura, mas pode ser acordado gravando nele (ele precisa de duas gravações, não sei por que, mas não me importo).
Para usá-lo apenas:
Para desbloquear, de outro terminal:
Makefile:
Código para memory.c:
fonte
De https://blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the
Um processo é colocado em um sono ininterrupto
(STAT D)
quando precisa esperar algo (normalmente E / S) e não deve manipular sinais enquanto aguarda. Isso significa que você não podekill
, porque tudo que mata é enviar sinais. Isso pode acontecer no mundo real se você desconectar o servidor NFS enquanto outras máquinas tiverem conexões de rede abertas.Podemos criar nossos próprios processos ininterruptos de duração limitada, aproveitando a
vfork
chamada do sistema.vfork
é comofork
, exceto que o espaço de endereço não é copiado do pai para o filho, em antecipação a umexec
que apenas jogaria fora os dados copiados. Convenientemente para nós, quandovfork
o pai espera ininterruptamente (por meio dewait_on_completion
) a criançaexec
ouexit
:Vemos a criança (
PID 1973, PPID 1972
) em um sono interrompível e os pais (PID 1972, PPID 13291
- a concha) em um sono ininterrupto enquanto aguarda 60 segundos na criança.Uma coisa interessante (travessa?) Sobre esse script é que os processos em um sono ininterrupto contribuem para a média de carga de uma máquina. Portanto, você pode executar esse script 100 vezes para fornecer temporariamente a uma máquina uma carga média elevada em 100, conforme relatado por
uptime
.fonte
kill
: /Basicamente, você não pode. Leia este artigo, intitulado: TASK_KILLABLE: Novo estado do processo no Linux .
excertoEste SO Q&A intitulado: O que é um processo ininterrupto? também explica isso.
Eu descobri isso neste livro muito interessante, intitulado: A Interface de Programação Linux: Um Manual de Programação de Sistemas Linux e UNIX .
fonte
TASK_KILLABLE
estado.