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?