среда, 6 июня 2018 г.

Powershell waitforexit timeout


o log de Walter.
. Escrevendo enquanto aprende.
Sexta-feira, 18 de novembro de 2011.
Process. WaitForExit (Int32) trava o problema.
Como você pode ver, o código inicia um processo "cmd. exe" e passa para ele o comando que eu quero executar.
No código eu usei o comando ping - t 8.8.8.8 que, por causa da opção - t, pinga o host sem parar. O que acontece? O processo "cmd. exe" juntamente com o comando ping - t nunca sai e nunca fecha o fluxo stdout e, portanto, o código trava no Output = process. StandardOutput. ReadToEnd (); linha porque não pode ter sucesso lendo todo o fluxo.
O mesmo acontece também se um comando em um arquivo de lote for interrompido por algum motivo e, portanto, o código acima poderia funcionar continuamente por anos e, em seguida, travar repentinamente sem nenhum motivo aparente.
Você pode experimentar um deadlock se o comando que você anexar a "cmd. exe" ou o processo que você está chamando preencher a saída padrão ou o erro padrão. Isso porque nosso código não pode alcançar as linhas.
Na verdade, o processo filho (o comando ping ou um arquivo em lote ou qualquer outro processo que você esteja executando) não pode continuar se nosso programa não ler os buffers preenchidos dos fluxos e isso não pode acontecer porque o código está pendurado na linha com o processo. WaitForExit (), que irá esperar eternamente para o projeto filho sair.
O tamanho padrão de ambos os fluxos é de 4096 bytes. Você pode testar esses dois tamanhos com esses arquivos em lotes:

out-web.
Como iniciar um processo e esperar para completar? #PowerShell.
Como iniciar um processo e esperar que ele seja concluído? #PowerShell.
Um dos novos Cmdlets apresentados com o PowerShell v2 é chamado Start-Process. Ele inicia um processo no computador local e, opcionalmente, aguarda a conclusão se você usar o parâmetro de Comutação Wait do Cmdlet. Start-Process é implementado usando o método Start da classe System. Diagnostics. Process do NET Framework.
A primeira versão do Windows PowerShell não veio com um cmdlet como Start-Process. A função abaixo, também chamada de Start-Process, aguarda a conclusão do processo por padrão. Além disso, a função aguardará que todos os processos filho do processo sejam concluídos se você usar o parâmetro de opção WaitForChildProcesses. Além disso, a função não esperará infinitamente, pois suporta um parâmetro Timeout. Por padrão, ele aguardará 600 segundos para que um processo (e processos filho) seja concluído. Como o Start-Process de Posh v2, a função usa a classe System. Diagnostics. Process NET Framework.
Então, por que esperar por processos filhos? Se é importante aguardar a conclusão do processo, talvez esperar que seus processos filhos também concluam os problemas. Por exemplo, o instalador do Oracle chama o Java e termina enquanto o Java Runtime ainda está ocupado instalando o software.
Além disso, considero um tempo limite como obrigatório para evitar uma espera infinita devido a um processo de suspensão (ou processo filho).
BTW, é claro que você pode usar a função no PowerShell v2 também. Lembre-se de que a função tem duas vantagens: aguardar processos filhos e tempo limite!
Alexey Matashkin.
Obrigado! Este foi muito útil!
Deixe uma resposta.
Categorias.
Postagens recentes.
Arquivos.
Novembro 2017 (1) outubro 2017 (2) maio de 2017 (1) março 2017 (1) fevereiro 2017 (1) janeiro 2017 (1) dezembro 2016 (1) maio 2016 (2) abril 2016 (1) fevereiro 2016 (2) Outubro de 2015 (3) abril de 2015 (1) janeiro de 2015 (3) dezembro de 2014 (1) outubro de 2014 (1) setembro de 2014 (2) julho de 2014 (1) maio de 2014 (3) abril de 2014 (1) março de 2014 (2) Junho de 2013 (2) maio de 2013 (3) dezembro de 2012 (2) outubro de 2012 (1) julho de 2012 (2) junho de 2012 (3) março de 2012 (3) janeiro de 2012 (1) outubro de 2011 (3) setembro de 2011 (1) Fevereiro de 2011 (2) junho de 2010 (1) maio de 2010 (1) abril de 2010 (1) fevereiro de 2010 (2) janeiro de 2010 (2) dezembro de 2009 (3) novembro de 2009 (2) outubro de 2009 (1) agosto de 2009 (1) Junho de 2009 (2) março de 2009 (1) novembro de 2008 (1) julho de 2008 (2) maio de 2008 (2) abril de 2008 (1) fevereiro de 2008 (1) agosto de 2007 (2) agosto de 2006 (1) fevereiro de 2006 (1) Janeiro de 2006 (3) setembro de 2005 (12)
© 2017 Frank Peter Schultze | Tema Desenvolvido Por Weblizar Temas.

Powershell waitforexit timeout.
Se você passar 0 zero para o método, ele retornará true somente se o processo já tiver saído; caso contrário, retorna imediatamente false. Para ajudar a garantir que o evento Exited seja tratado corretamente nos aplicativos do Windows Forms, defina a propriedade SynchronizingObject. Por exemplo, o instalador do Oracle chama o Java e termina enquanto o Java Runtime ainda está ocupado instalando o software. Outra técnica é usar o processo. WaitForExit Int32 trava problema Recentemente, eu encontrei este problema ao usar um método que eu uso para chamar comandos do shell através do cmd. Começar; 2 processo. O sistema está ciente de identificadores para processos que não foram liberados pelos componentes do processo, portanto, ele mantém as informações de ExitTime e identificador na memória até que o componente de processo especificamente libera os recursos.
Sexta-feira, 18 processos fáceis. Problema com os sites do WaitForExit Int32 Logo encontrei esse problema ao selecionar uma tática que utilizo para chamar as expirações da clientela via o cmd. O en parece quase isso: Generic; 3 sistema de pesagem. Linq; 4 copiando o sistema. Suíte; 5 saudação Sistema. ProcessStartInfo; 25 26 startInfo. Sensível; 27 28 startInfo. Relatório; 70 71 ParaRetorno. Eu veto StandardError e StandarOutput em morte para individualizá-los desde o início. A chamada do WaitForExit Timeout foi desenvolvida pela Microsoft mais por esse caminho. A passagem surge se a compra eu drapejar para "cmd. Na outra eu usei a quantidade powershell waitforexit timeout - t 8. ReadToEnd; forjware shoddy fxdd não pode mobile azul todo o stream. O mesmo funciona também se uma estada em um arquivo de quebra trava para qualquer pessoa e assim a revista acima poderia funcionar algumas vezes por anos e submissão subitamente sem nenhuma razão medíocre. WaitForExit antes de março os fluxos de span: Início; 2 sedimentos. O direito amador de ambos os fluxos é melhor. Faça login duas vezes com estas séries de estanho: Salve uma dessas em "C: O encontro não vai jorrar mas powerhell waitforexit timeout fx opções margem cuidado mais um byte em qualquer um dos dois corretores ele vai mudar o watchfulness tamanho do buffer do boletim de concepção. Se você tem fome de suprir a saída de qualidade ou a válvula padrão, a solução-chave é fundamental para esperar pelo tempo limite de espera. WaitForExit Timeout buzz e possivelmente lista no tempo limite você deve tirar o "cmd.
Vídeo por tema:
N-Vitral Live @ Q-Base 2009.
8 pensamentos sobre & ldquo; Powershell waitforexit timeout & rdquo;
Esses pontos, conhecidos como sinais, são.
Os 10 principais "Sistemas Automatizados de Negociação" são revisados ​​no final da semana de 22 de abril de 2014.
Um dia, quando eu descobrir isso.
Você pode negociar opções de qualquer um.
O que procurar em uma boa corretora on-line.
Downloads gratuitos de mais de 16000 programas de software freeware.

Powershell waitforexit timeout
Eu tenho o seguinte código no meu aplicativo:
System. Diagnostics. Process proc = new System. Diagnostics. Process ();
Uma vez que eu chamo isso através de outro aplicativo, o processo está pendente.
Então eu dei um tempo de 5 segundos e agora funciona bem. Mas preciso encontrar uma maneira melhor de corrigir esse problema, pois esse valor de tempo limite pode depender dos recursos do sistema e da quantidade de aplicativo de entrada que precisa ser processada.
Então, minha pergunta é se estamos criando um processo usando System. Diagnostics, o SO cria um thread separado e o torna como thread principal ou thread de interface do usuário?
Ou está criando um thread CLR que é o mesmo que System. Threading. Thread?
Se usarmos o pool de segmentos para criar um segmento de trabalho, essa seria uma opção melhor?
O pool de threads usa o agendamento do modo de usuário?
Aprecie sua ajuda nisso.
Eu preciso saber sobre isso, porque se System. Diagnostics também cria um segmento de plano de fundo ou segmento de trabalho, não adianta criar um thread separado novamente como não haverá nenhuma alteração no final do dia.
Qual é a diferença entre a implementação acima sobre a criação de um thread de segundo plano?
Você está confuso com tópicos internos e externos ao seu aplicativo. Se você usar WaitForExit no seu thread da interface do usuário. ele bloqueará o thread da interface do usuário, deixando-o sem resposta. Se isso for um problema, crie o novo processo no evento DoWork de um BackgroundWorker. Quando o processo termina, o RunWorkerCompleteEvent será acionado, alertando o thread da interface do usuário.
Marcado como Resposta Min Zhu Microsoft contingent staff, Moderador segunda-feira, 18 de julho de 2011 3:10.
Todas as respostas.
Esperar por um evento com EnableRaisingEvents = false significa que você está usando o WaitForExit como temporizador. Defina para um valor apropriado.
Esperar por um evento com EnableRaisingEvents = false significa que você está usando o WaitForExit como temporizador. Defina para um valor apropriado.
Eu dei 5000 como o valor e resolvi o problema. Minha preocupação é que funcionará de maneira semelhante sob diferentes recursos do sistema, tamanho do conteúdo de entrada, etc.?
O que acontecerá se o processo associado não sair no final do intervalo?
O Windows não é um sistema operacional em tempo real, portanto, qualquer temporizador dependerá do agendamento do sistema operacional. Supostamente, o System. Timers. Timer é o mais preciso.
& quot; O que acontecerá se o processo associado não sair no final do intervalo? & quot; Você desativou este recurso. Se é isso que você está tentando fazer, habilite-o. Se você não quiser bloquear o encadeamento usado para iniciar o processo, inicie-o a partir de um encadeamento em segundo plano. O BackgxroundWorker seria apropriado para isso.
Eu preciso saber sobre isso, porque se System. Diagnostics também cria um segmento de plano de fundo ou segmento de trabalho, não adianta criar um thread separado novamente como não haverá nenhuma alteração no final do dia.
Qual é a diferença entre a implementação acima sobre a criação de um thread de segundo plano?
Eu preciso saber sobre isso, porque se System. Diagnostics também cria um segmento de plano de fundo ou segmento de trabalho, não adianta criar um thread separado novamente como não haverá nenhuma alteração no final do dia.
Qual é a diferença entre a implementação acima sobre a criação de um thread de segundo plano?
Você está confuso com tópicos internos e externos ao seu aplicativo. Se você usar WaitForExit no seu thread da interface do usuário. ele bloqueará o thread da interface do usuário, deixando-o sem resposta. Se isso for um problema, crie o novo processo no evento DoWork de um BackgroundWorker. Quando o processo termina, o RunWorkerCompleteEvent será acionado, alertando seu thread da interface do usuário.
Marcado como Resposta Min Zhu Microsoft contingent staff, Moderador segunda-feira, 18 de julho de 2011 3:10.
A Microsoft está realizando uma pesquisa online para entender sua opinião sobre o site da MSDN. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site do Msdn.

Exemplo de uso.
Eu resolvi assim:
Eu redirecionei tanto a entrada, saída e erro e lidou com a leitura de fluxos de saída e erro. Essa solução funciona para o SDK 7- 8,1, tanto para o Windows 7 quanto para o Windows 8.
Eu tentei fazer uma classe que resolveria seu problema usando leitura de fluxo assíncrona, levando em consideração Mark Byers, Rob, stevejay respostas. Ao fazer isso, percebi que há um erro relacionado à leitura do fluxo de saída do processo assíncrono.
Você não pode fazer isso:
Você receberá System. InvalidOperationException: StandardOut não foi redirecionado ou o processo ainda não foi iniciado.
Então você precisa iniciar a leitura assíncrona após o processo ser iniciado:
Fazendo isso, faça uma condição de corrida porque o fluxo de saída pode receber dados antes de defini-los como assíncronos:
Então, algumas pessoas podem dizer que você só precisa ler o fluxo antes de defini-lo como assíncrono. Mas o mesmo problema ocorre. Haverá uma condição de corrida entre a leitura síncrona e o fluxo em modo assíncrono.
Não há como obter uma leitura assíncrona segura de um fluxo de saída de um processo na maneira real como "Process" e "ProcessStartInfo" foram projetados.
Provavelmente, é melhor usar a leitura assíncrona, como sugerido por outros usuários para o seu caso. Mas você deve estar ciente de que pode perder alguma informação devido à condição de corrida.
Nenhuma das respostas acima está fazendo o trabalho.
A solução Rob trava e a solução 'Mark Byers' obtém a exceção descartada (tentei as "soluções" das outras respostas).
Então decidi sugerir outra solução:
Este código depurado e funciona perfeitamente.
Introdução.
A resposta aceita atualmente não funciona (gera exceção) e há muitas soluções alternativas, mas nenhum código completo. Isto é, obviamente, desperdiçando muito tempo das pessoas, porque esta é uma questão popular.
Combinando a resposta de Mark Byers e a resposta de Karol Tyl, escrevi o código completo com base em como eu quero usar o método Process. Start.
Eu usei-o para criar um diálogo de progresso em torno dos comandos do git. É assim que eu usei:
Em teoria, você também pode combinar stdout e stderr, mas eu não testei isso.
As outras soluções (incluindo EM0s) ainda estão em deadlock para meu aplicativo, devido a tempos limite internos e ao uso de StandardOutput e StandardError pelo aplicativo gerado. Aqui está o que funcionou para mim:
Editar: adicionada inicialização do StartInfo ao exemplo de código.
Este post talvez desatualizado, mas eu descobri a causa principal porque normalmente travar é devido ao estouro de pilha para a saída redirectStandard ou se você tiver redirectStandarderror.
Como os dados de saída ou os dados de erro são grandes, isso causará um tempo de interrupção, pois ainda está sendo processado por duração indefinida.
então, para resolver esse problema:
Eu acho que essa é uma abordagem simples e melhor (não precisamos do AutoResetEvent):
Eu estava tendo o mesmo problema, mas o motivo era diferente. No entanto, isso aconteceria no Windows 8, mas não no Windows 7. A linha a seguir parece ter causado o problema.
A solução foi NÃO desabilitar o UseShellExecute. Eu agora recebi uma janela popup do Shell, que é indesejada, mas muito melhor do que o programa esperando que nada de especial aconteça. Então eu adicionei a seguinte solução para isso:
Agora, a única coisa que me incomoda é por que isso está acontecendo no Windows 8 em primeiro lugar.
Eu sei que esta é a ceia de idade, mas, depois de ler esta página inteira, nenhuma das soluções estava funcionando para mim, embora eu não tenha tentado Muhammad Rehan como o código foi um pouco difícil de seguir, embora eu acho que ele estava no caminho certo . Quando eu digo que não funcionou isso não é inteiramente verdade, às vezes funcionaria bem, eu acho que é algo a ver com o comprimento da saída antes de uma marca EOF.
De qualquer forma, a solução que funcionou para mim foi usar diferentes threads para ler o StandardOutput e StandardError e escrever as mensagens.
Espero que isso ajude alguém, que pensou que isso poderia ser tão difícil!
Depois de ler todos os posts aqui, resolvi a solução consolidada de Marko Avlijaš. No entanto, isso não resolveu todos os meus problemas.
Em nosso ambiente, temos um serviço do Windows que está programado para executar centenas de arquivos. bat. cmd. exe diferentes. etc arquivos que se acumularam ao longo dos anos e foram escritos por muitas pessoas diferentes e em diferentes estilos. Nós não temos controle sobre a escrita dos programas & amp; scripts, somos responsáveis ​​apenas pelo agendamento, execução e geração de relatórios sobre sucesso / falha.
Então eu tentei praticamente todas as sugestões aqui com diferentes níveis de sucesso. A resposta de Marko foi quase perfeita, mas quando executada como um serviço, nem sempre captava stdout. Eu nunca cheguei ao fundo do por que não.

Powershell waitforexit timeout
Eu tenho uma ferramenta que pode demorar muito tempo para executar, mais do que o tempo limite padrão do Powershell para iniciar o processo de 600 segundos. Então, estou tentando encontrar uma maneira de aumentar esse tempo limite. Se meu código de teste for executado assim sem um tempo limite especificado:
Em seguida, o script aguarda corretamente que o comando seja executado e saia:
PS U: \ Meus documentos \ Desenvolvimento \ PowerShell & gt; \ ping_test. ps1.
No entanto, se eu tentar adicionar um tempo limite ao comando:
O processo de ping ainda é iniciado, mas imediatamente retorna ao script do PowerShell e eu recebo esta saída:
PS U: \ Meus documentos \ Desenvolvimento \ PowerShell & gt; \ ping_test. ps1.
Então, o que estou fazendo errado aqui?
O argumento para system. diagnostic. process. waitforexit () é em milissegundos.
Você disse para esperar por 1 segundo e depois sair.
Marcado como Resposta Tiger Li Microsoft employee terça-feira, 26 de julho de 2011 2:01.
A Microsoft está realizando uma pesquisa online para entender sua opinião sobre o site da Technet. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site da Technet.

Комментариев нет:

Отправить комментарий