Qual o significado de PREEMPTIVE_OS_PIPEOPS?

Publiquei um post de um cenário na qual o comando KILL que não consegue matar o processo.

Desafio: Comando KILL demorado (infinito)

Esse foi um desafio (fácil, pelo jeito). A resposta é usar uma ferramenta para matar o processo do NOTEPAD.EXE, seja através de script Powershell, usando o Task Manager ou o comando TASKKILL.

Alguns comentários interessantes:

  • Luiz Mercante comentou sobre os processos filhos do SQL Server
  • Advaldo falou sobre usar o Process Explorer
  • Laerte e Leivio comentaram sobre o PREEMPTIVE_OS_PIPEOPS

Assim, deixo mostrar uma experiência bem interessante (esse é um ótimo DEMO para fazer com os amigos).

1) O primeiro passo é baixar o Process Explorer do site TechNet.

https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

2) Em seguida, rodamos o Process Explorer usando o modo elevado.

image

3) Agora procuramos o processo SQLSERVR.EXE na lista. Assim, observamos a cadeia de processo pai e filho.

image

Agora vamos a mágica!

4. A comunicação entre processos é sempre feita através de um mecanismo de IPC (Inter Process Communication). Nesse caso, o SQL Server utiliza um objeto de Named Pipe. Imaginem o motivo disso…

image

5. Vamos investigar o comportamento do NOTEPAD.EXE. Ele possui dois Named Pipe (a figura abaixo é praticamente igual a anterior, mas note que estou observando o processo do Command Prompt).

image

Programadores C/C++ : esses objetos correspondem ao stdin e stdout

6. Do ponto de vista do SQL Server, o comando xp_cmdshell espera pelos dados provenientes do Named Pipe que serão gerados pelo processo filho. Outra opção seria o fechamento da comunicação. A mágica é que o Process Explorer consegue forçar o fechamento de objetos!

image

7. Sem matar o processo do NOTEPAD.EXE, conseguimos interromper a comunicação entre os processos. SQL Server.

image

Vamos a conclusão.

Matar o NOTEPAD é uma solução (e eu faria isso também). Porém, bastava apenas fechar o canal de comunicação entre os processos e tudo voltaria ao normal.

Qual o significado de PREEMPTIVE_OS_PIPEOPS?

O comando xp_cmdshell cria um processo filho e abre uma comunicação usando os streams stdin e stdout, que correspondem a objetos de Named Pipe. Durante essa comunicação, o SQL Server sinaliza a espera pelo wait type PREEMPTIVE_OS_PIPEOPS. Portanto, isso é nada mais, nada menos, do que uma dica sobre qual atividade que está sendo realizada naquele exato momento.