Misterioso Comando KILL

Estou gastando o terceiro post para falar sobre o comando KILL. Se você não leu os outros, dê uma olhada:

1. Desafio: Comando KILL demorado (infinito)
2. Qual o significado de PREEMPTIVE_OS_PIPEOPS?

Dessa vez, vou mostrar como que o comando KILL realmente funciona e como que ele consegue “matar” os processos.

DBCC STACKDUMP

Sim, esse é o comando que usaremos. Antigamente existia um comando chamado DBCC PSS (Process Session Structure), mas dessa vez não tem jeito. Temos que usar alguns artifícios diferentes.

Ao rodar o comando:

DBCC STACKDUMP

Observamos que são gerados 3 arquivos no diretório do log.

image

Abriremos o arquivo TXT, que contém uma descrição textual sobre o memory dump.

image

Agora vou procurar pela minha sessão 52: utilize o Find –> “m_sessionId = 52”.

image

Essas são as propriedades da sessão (aos programadores C++, esse é um objeto chamado CSession e propriedade m_fKill ). Podemos até dizer que a DMV sys.dm_exec_sessions corresponde a lista completa de todos os objetos CSession.

Voltando ao assunto. Ao executar o comando KILL, ele apenas sinaliza a respectiva sessão para que ela aborte o quanto antes. Nessa situação, a verificação é feita logo depois da espera PREEMPTIVE_OS_PIPEOPS. O código fonte é semelhante com isso:

 function xp_cmdshell ( process_name ) 
{
    CreateProcess( process_name );
    
     SetStatus( SUSPENDED, PREEMPTIVE_OS_PIPEOPS );
  
     WaitResponse( process.stdout );

    SetStatus( RUNNING, NULL  );

  
     if ( this.m_fKill == 1 ) {
        abort();
    }
}
  

Conclusão: O comando KILL não mata ninguém. Ele serve apenas para mudar a flag m_fKill , que permite a própria sessão abortar a execução.