Freigeben über


Desafio: Comando KILL demorado (infinito)

A ideia desse post surgiu há 3 semanas durante um treinamento interno com a equipe de suporte. Desde então tivemos comemorações de Natal e Ano Novo. Espero que todos tenham aproveitado essa época. Aproveito para desejar a todos um ótimo ano de 2014!!!

O tópico de hoje é entender um conceito relacionado a threads e tarefas do SQL Server. Estava fazendo diagnósticos em um servidor e decidi usar o comando xp_cmdshell para procurar arquivos no sistema. Comecei assim:

image

Ótimo! Consegui o resultado esperado. O segundo passo foi executar um comando para procurar uma DLL específica, mas sem querer (por costume?) escrevi “notepad” na linha de comando. Eis que a query ficou executando e aquele círculo verde, rodando.

image

Minha reação foi executar o comando de KILL. Infelizmente nem isso foi capaz de cancelar a bobagem anterior. O comando xp_cmdshell ficou rodando e o comando KILL apresentou a mensagem de que estava tudo ok e logo seria completado (“ … in progress. Estimated rollback completion: 0%. Estimated time ramaining 0 seconds”).

image

Esse é o desafio: seria possível executar comandos que rodam infinitamente no servidor e não podem ser cancelados pelo DBA?

O que fazer nesse caso?

Alguma explicação?

- Fabricio Catae

Comments

  • Anonymous
    January 06, 2014
    Bom, acredito eu que quando fazemos um KILL o SQL Server tem que "avisar" ao cliente que ele esta sendo "morto" ou o processo sendo "killed".  Neste caso vejo que sim, como temos essa comunicação (acredito eu, na minha hipotese) entre o SQL e o cliente, podemos sim ter esse "hang" Para matar esse processo (notepad) no SQL, pare o no SO Abra o powershell  e get-process notepad | stop-process -force Isso vai matar todos os processos notepad e provavelmente vai liberar o SQL também.

  • Anonymous
    January 06, 2014
    The comment has been removed

  • Anonymous
    January 06, 2014
    The comment has been removed

  • Anonymous
    January 06, 2014
    Já responderam??? Isso foi na mosca... powershell, task manager ou taskkill estão todas corretas. Agora vai uma segunda pergunta: por que o SQL Server não fez isso por você? Uma dica: dm_os_waiting_tasks.

  • Anonymous
    January 06, 2014
    Bom, andei  fazendo uns testes e com o select na dm_os_waiting_task o wait_type foi PREEMPTIVE_OS_PIPEOPS. Dando uma pesquisada no assunto seria porque neste caso da xp_cmdshell o processo é executado pelo SO e o SQL Server não tem controle sobre isso ? Algo como é aberto uma thread no SQL edo SQL abre no SO e o Kill nao tem como saber se o processo é externo ao SQL ?

  • Anonymous
    January 06, 2014
    The comment has been removed

  • Anonymous
    January 06, 2014
    Então..pensando no caso do Luiz, eu acredito que não obteve resposta do SO, porque chamando Notepad ele esta abrindo a GUI e não em modo de execução de comando e isso, partindo da ideia do Advaldo, precis a de interação  do usuario pra fechar. Por exemplo. Se eu abrir um processo powershell desta maneira : xp_cmdshell 'Powershell' Vai dar o mesmo problema, mas se eu abrir : xp_cmdshell 'Powershell.exe -command "get-process"' Não trava e traz o retorno, pois eu fiz em modo de execução de comando e tive um retorno do comando pelo SO e consequentemente mandando para o SQL Bom..estou apenas supondo..seila se to viajando na maionese tb hehehe

  • Anonymous
    January 06, 2014
    E o mais legal usando o Process explorer, podemos ver o sqlservr.exe e abaixo dele na cadeia o cmd e o notepad. Parto do mesma suposição, que por ser um processo externo ao SQL , ele não tem controle sobre ele. FAzendo uma analogia bem tusca, seria como uma modelagem com FK´s. Nao consigo dropar uma dado em uma tabela pai senao tirar a filha primeiro..no caso tenho que parar o processo no SO primeiro que seria o final da cadeia.

  • Anonymous
    January 06, 2014
    PREEMPTIVE_OS_PIPEOPS: PREEMPTIVE - chamada externa ao dominio do pool de tarefas do SQL Server. Ou seja muda a execução para o pre-emptive scheduling mode do host chamado. OS - chamada ao SO. PIPEOPS - comunicação inter processos utilizando PIPE(sqlservr.exe e cmd.exe). Em poucas palavras "Seria o redirecionamento da saída padrão de um programa para a entrada padrão de outro". Para a resposta: a chamada ao XP_CMDSHELL e sicrona o qual sempre tem uma halt a esperar.! Está correto?

  • Anonymous
    January 06, 2014
    Se temos a cadeia no Process Explorer e não tivermos acesso ao taskill ou ao powershell, somente reiniciando o serviço para o notepad ser finalizado? Pelo jeito sim, correto?

  • Anonymous
    January 06, 2014
    Entao Advaldo, se nao tiver como parar o processo no SO, no meu ver sim.

  • Anonymous
    January 06, 2014
    Os comentários do Laerte e do Leivio sobre o PREEMPTIVE_OS_PIPEOPS foram precisos. Luiz e Advaldo, vocês estão no caminho certo. Estou escrevendo um post para mostrar algo bem interessante com o Process Explorer.