Tuesday 30 May 2017

Waitforexit Trava Fogo


Eu tenho um serviço que às vezes chama um arquivo em lote. O arquivo em lotes leva 5-10 segundos para executar: o arquivo existe e o código funciona quando eu executo o mesmo código no console. No entanto, quando ele é executado dentro do serviço, ele desliga em WaitForExit (). Eu tenho que matar o arquivo em lotes do Processo para continuar. (Tenho certeza de que o arquivo existe, como eu posso vê-lo na lista de processos.) Como posso corrigir este desligamento Update 1: o código Kevins me permite obter saída. Um dos meus arquivos em lote ainda está suspenso. C: EnterpriseDBPostgres8.3binpgdump. exe - i - h localhost - p 5432 - U postgres - F p - a - D - v - fc: backupcasecocherbackupdateevent2008.sql - t public. dateevent DbTest O outro arquivo em lote é: C: EnterpriseDBPostgres8.3binvacuumdb. exe - U postgres - d DbTest Verifiquei o caminho e o caminho postgresql está bem. O diretório de saída existe e ainda funciona fora do serviço. Qualquer ideia Atualização 2: Em vez do caminho do arquivo em lote, escrevi o C: EnterpriseDBPostgres8.3binpgdump. exe para o proc. StartInfo. FileName e adicionei todos os parâmetros para proc. StartInfo. Arguments. Os resultados são inalterados, mas vejo o pgdump. exe na janela de processo. Mais uma vez isso só acontece dentro do serviço. Atualização 3: Executei o serviço com um usuário no grupo de administradores, sem sucesso. Eu restaurei nulo para o nome de usuário e senha de serviços. Atualização 4: criei um serviço simples para escrever um rastreamento no log de eventos e execute um arquivo em lote que contém o diretório. Agora ele irá pendurar no proc. Start () - Eu tentei mudar a Conta do LocalSystem para o Usuário e eu configurei o usuário e a senha do administrador, ainda nada. Usando System using System. Collections. Generic usando System. Linq usando System. Text usando System. Diagnostics namespace VG string targetDir string. Format (D: adaptadoressetup) é onde mybatch. bat reside proc new Process () proc. StartInfo. WorkingDirectory targetDir Proc. StartInfo. FileName mybatch. bat proc. StartInfo. Arguments string. Format (10) este é o argumento proc. StartInfo. CreateNoWindow false proc. Start () proc. WaitForExit () catch (Exception ex),, ex. Message, ex. StackTrace. ToString ()) respondeu 7 de janeiro 10 às 9:47 O que o arquivo em lote faz Você está certo de que o processo está sendo lançado com privs suficientes para executar o arquivo em lote Os serviços podem ser limitados no que eles são autorizados a fazer. Certifique-se também se você está fazendo algo como usin o comando de cópia para substituir um arquivo que você faz algo como: Além disso, certifique-se de que está usando caminhos completos para os comandos do lote, etc. Se o arquivo em lote estiver iniciando um aplicativo GUI em alguns Tipo de modo de consola, isso também pode ser um problema. Lembre-se, os serviços não têm uma área de trabalho (a menos que você ative a interação com a área de trabalho) para desenhar qualquer tipo de janelas ou caixas de mensagens. No seu programa, você pode querer abrir os tubos stdout e stderr e lê-los durante a execução, caso você receba mensagens de erro ou qualquer coisa. WebServices provavelmente está sendo executado como a conta do IUSR, ou a conta anônima, que nunca, para que isso possa ser um problema para você. Se funcionar quando você o executa no console, isso é apenas o primeiro passo. ) Eu não lembro se System. Diagnostics. Estão disponíveis apenas em depuração ou não. Provavelmente não, mas alguns deles podem ser. Eu tenho que verificar isso para você. Espero que isso te dê algumas ideias. Respondeu 11 de dezembro 08 às 21:58 pgdump. exe provavelmente está solicitando a entrada do usuário. Este banco de dados precisa de autenticação Você está confiando em quaisquer variáveis ​​de AMBIENTE que não estarão presentes para o serviço Eu não conheço o pgdump, mas quais são os outros motivos possíveis que solicitaria a entrada respondida 12 de dezembro 08 às 15:10 Eu posso fazer este comando a partir do Linha de comando de cmd. exe e funciona sem aviso. Ndash Patrick Desjardins 12 de dezembro 08 às 15:25 O próximo passo que eu tomaria é abrir o depurador e ver se você pode dizer o que o programa está aguardando. Se você estiver expandegado na depuração na montagem, você poderá obter uma IDEA do que está acontecendo usando ferramentas como ProcExp, FileMon, etc. Sendo um SERVIÇO do Windows, e não um serviço da Web, faz um pouco de diferença. De qualquer forma, você tentou minha sugestão de configurar o Permitir que o Serviço interaja com a área de trabalho. Se você está desesperado, talvez você tente iniciar o cmd. exe em vez do seu arquivo em lote. Então, usando os parâmetros de linha cmd. exes cmd, você pode ter o IT iniciar o arquivo em lote. Isso provavelmente lhe dará uma janela de prompt cmd para ver a saída real, se você ativar a interação com a área de trabalho. Para obter ajuda completa sobre cmd. exe, basta digitar cmd em qualquer prompt de comando. O código parece quase isso: como você pode ver, o código inicia um processo cmd. exe e passa para ele o comando que quero ser executado. Eu redireciono StandardError e StandarOutput para lê-los a partir do código. O código lê-los antes do processo. WaitForExit (Timeout) chamada conforme recomendado pela Microsoft (mais sobre isso mais tarde). O problema surge se o comando que eu envio para cmd. exe nunca termina ou trava indefinidamente. No código eu usei o comando ping - t 8.8.8.8 que, por causa da opção - t, pings o host sem parar. O que acontece O processo cmd. exe juntamente com o comando ping - t nunca sai e nunca fecha o fluxo de stdout e, portanto, o nosso código trava na linha Output. StandardOutput. ReadToEnd () do processo de saída porque não conseguiu ler todo o fluxo. O mesmo acontece também se um comando em um arquivo em lotes trava por qualquer motivo e, portanto, o código acima pode funcionar continuamente durante anos e, em seguida, é suspenso repentinamente sem nenhum motivo aparente. Antes de escrever, recomendava ler fluxos redirecionados antes do processo. WaitForExit (Timeout), bem, isso é especialmente verdadeiro se você usar a assinatura WaitForExit sem o tempo limite. Se você chamar processo. WaitForExit () antes de ler os fluxos redirecionados: código 2: você pode enfrentar um impasse se o comando que você anexar ao cmd. exe ou o processo que você está chamando preencher a saída padrão ou erro padrão. Isso porque nosso código não pode atingir as linhas de processo de saída. StandardOutput. ReadToEnd () De fato, o processo filho (o comando ping ou um arquivo em lote ou o processo que estiver executando) não pode continuar se o nosso programa não lê os buffers preenchidos dos fluxos e isso não pode acontecer porque o código está pendurado em A linha com o processo. WaitForExit () que aguardará para sempre que o projeto filho saia. O tamanho padrão de ambos os fluxos é de 4096 bytes. Você pode testar esses dois tamanhos com esses arquivos em lote: o primeiro script escreve 4096 bytes para a saída padrão e o segundo para erro padrão. Salve um destes em C: testbuffsize. bat e execute o processo de chamada do nosso programa. WaitForExit () antes do processo de saída. StandardOutput. ReadToEnd () como no código 2. Você pode fazê-lo escrevendo CommandResult Resultado ExecuteShellCommandSync (c: testbuffsize. bat, 1000) na linha 13 do código 1. O código não irá pendurar, mas se você escrever um byte mais em qualquer um dos dois fluxos, ele irá transbordar o tamanho do buffer tornando o programa aguentar. Se você precisa redirecionar e ler a saída padrão ou o erro padrão, a melhor solução é lê-los de forma assíncrona. Uma excelente maneira de fazer isso é proposta por Mark Byers neste segmento stackoverflow. Como a última coisa, observe que, se o processo filho sair apenas porque você usa o processo. WaitForExit (Timeout) assinatura e ele realmente vai no tempo limite, você deve matar o processo cmd. exe e seus possíveis filhos.

No comments:

Post a Comment