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.
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.
3) Agora procuramos o processo SQLSERVR.EXE na lista. Assim, observamos a cadeia de processo pai e filho.
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…
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).
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!
7. Sem matar o processo do NOTEPAD.EXE, conseguimos interromper a comunicação entre os processos. SQL Server.
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.
Comments
Anonymous
January 08, 2014
Muito bom o artigo e realmente me tirou algumas dúvidas com relação a comunicação SO - SQL.Anonymous
January 08, 2014
Muito bom o artigo e realmente me tirou algumas dúvidas com relação a comunicação SO - SQL.Anonymous
January 08, 2014
Muito bacana a explicação Catae! O Desafio parecia complexo, mas a solucao acabava sendo simples. Mas no meu caso sabia como resolver mas nao entendia o porque do acontecimento. Gostei demais!Anonymous
January 08, 2014
Muito legal mesmo Fabricio!Anonymous
July 15, 2014
Good one.Anonymous
October 16, 2014
Funcionou perfeitamente. Entrando pelo Process Explorer, e matando o NOTEPAD do sqlsrvr, consegui matar o processo travado a 2 dias.Anonymous
June 23, 2017
Desculpa, pela pergunta, mas vocês excluiu os dois \Device\NamedPipe?- Anonymous
June 28, 2017
Apenas fechar o processo que está conectado via stdin/stdout.
- Anonymous