O Agendador de Tarefas apenas mata cmd.exe, mas não seus processos filhos

6

Nosso cliente tem alguns servidores Windows 2003 executando tarefas em lote ativadas pelo Agendador de Tarefas. Os programas reais que executam o trabalho são processos .exe personalizados e são agregados em scripts .cmd para que sejam lançados juntos pelo Agendador de Tarefas quando o intervalo agendado se aproximar. As linhas dentro dos scripts cmd podem ou não usar o comando Call para iniciar os programas .exe separados.

Nessa configuração, o Agendador de Tarefas está monitorando com eficácia o cmd.exe e, ao usar o Process Explorer, é possível observar que os processos .exe secundários estão estacionados na árvore do processo cmd.exe. No entanto, quando o Agendador de Tarefas elimina cmd.exe devido a exceder o limite de tempo permitido, os processos .exe secundários não podem ser eliminados junto com seus pais e se tornam órfãos. Esses processos permanecem paralisados indefinidamente. Devido ao estado dos encadeamentos do processo mostrados no Process Explorer, suspeito que esses processos acabam com erro e exibiram uma caixa de diálogo do depurador .NET (esses são aplicativos .NET) que não podem ser vistos, pois o usuário do trabalho em lote é um usuário separado conta.

Inicialmente, quando eu estava investigando esse comportamento em minha estação de trabalho do Windows XP, observei que os processos .exe filho iniciam a partir do meu script .cmd de teste são mortos junto com o cmd.exe quando o Agendador de Tarefas decide que o tempo acabou. Não havia como eu ser órfã dos processos filhos.

Com base em um palpite, eu eventualmente mudei para uma máquina Windows 2003 para testar isso. Da mesma forma, o filho processa para ser finalizado como aqueles em minha estação de trabalho. Meu segundo passo foi usar outra conta de usuário para executar a tarefa agendada. Dessa vez, o cmd.exe é eliminado após o limite de tempo ser excedido, mas os processos filhos permanecem em pé, exatamente como o que meu cliente observava em seus servidores de produção.

Se eu fizer login antecipadamente na conta de usuário em lote (que por acaso é outra conta de administrador) para reivindicar uma sessão de desktop, qualquer erro ou pop-ups de informações dos meus programas .exe serão roteados e renderizados nessa área de trabalho, permitindo-me ver a saída real do usuário. Se eu apenas fizer logon após a tarefa agendada ter sido chamada, a sessão da área de trabalho não "recuperará" as janelas dos processos existentes; eles ficam escondidos para sempre.

A minha pergunta é, quais as condições que estão faltando aqui que podem fazer com que o Agendador de Tarefas não acabe com os processos filhos em um cmd.exe? O que é especial sobre o uso de outra conta que induziria esse comportamento, mas não ao usar minha conta de administrador atual para executar a tarefa agendada?

    
por icelava 29.07.2009 / 05:41

5 respostas

2

Tente usar "Taskkill / T" na linha de comando. (/ T = “… Encerra o processo especificado e qualquer processo filho iniciado por ele…”)

Se você tiver vários processos em execução (geralmente temos 5 ou mais "powershell.exe" em execução), adicione a coluna "Linha de Comando" à guia "Detalhes" no Gerenciador de Tarefas. Isso deve deixar claro qual ID do processo é a que você deseja eliminar

    
por 14.02.2014 / 15:55
1

Os processos são independentes no Windows - Matar um processo pai não terminará automaticamente um processo filho.

    
por 01.03.2010 / 16:04
0

Se você acha que é devido a uma mensagem de depurador aparecendo, você tentou agrupar o código em try{}catch{} e registrar o erro?

Caso contrário, talvez você possa fazer com que os processos gravem a saída de WindowsPrincipal wp = new WindowsPrincipal(WindowsIdentity.GetCurrent())

Eu suspeito que as crianças estão, de alguma forma, aumentando seu nível de privilégio para Administrador e não podem ser mortas com os pais.

Para testar isso sem modificar o código, você pode escrever outra tarefa agendada que tente matar os outros processos usando taskkill . Esta tarefa agendada deve ser executada como o Administrador. Se isso funcionar, então parece que é um problema de segurança.

    
por 29.07.2009 / 05:51
0

Que tal usar o utilitário pskill , que faz parte da suíte SysInternals. Este programa pode matar processos pelo nome. Eu adicionaria uma tarefa agendada, que será executada alguns minutos depois que você esperar que os processos sejam concluídos, que executarão o pskill para finalizá-los.

PSKill também pode ser executado sob as credenciais de usuário que você fornece na linha de comando.

    
por 29.07.2009 / 12:59
0

Não sei se isso resolverá seu problema, mas se ele estiver relacionado às caixas pop-up (e pode ser - o aplicativo está em um estado com falha e suspenso enquanto o usuário inexistente decide o que fazer sobre isso).

Dê uma olhada no link e veja se você não consegue livrar-se dessas caixas ...

    
por 29.07.2009 / 16:25