Сервис зависает в WaitForExit после вызова пакетного файла

18
задан 4444 17 June 2014 в 15:11
поделиться

7 ответов

Вот то, что я использую для выполнения пакетных файлов:

proc.StartInfo.FileName                 = target;
proc.StartInfo.RedirectStandardError    = true;
proc.StartInfo.RedirectStandardOutput   = true;
proc.StartInfo.UseShellExecute          = false;

proc.Start();

proc.WaitForExit
    (
        (timeout <= 0)
            ? int.MaxValue : timeout * NO_MILLISECONDS_IN_A_SECOND *
                NO_SECONDS_IN_A_MINUTE
    );

errorMessage = proc.StandardError.ReadToEnd();
proc.WaitForExit();

outputMessage = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();

я не знаю, добьется ли это цели для Вас, но у меня нет проблемы его зависанием.

29
ответ дан 30 November 2019 в 06:12
поделиться

pg_dump.exe, вероятно, запрашивает ввод данных пользователем. Эта база данных требует аутентификации? Вы полагаетесь на какие-либо ПЕРЕМЕННЫЕ СРЕДЫ, которые не будут присутствовать для сервиса? Я не знаю pg_dump, но каковы другие возможные причины, которые он запросил бы вход?

3
ответ дан 30 November 2019 в 06:12
поделиться

Что делает пакетный файл? Вы уверены, что процесс становится запущенным с достаточным количеством privs для выполнения пакетного файла? Сервисы могут быть ограничены в том, что им позволяют сделать.

Также удостоверяются, делаете ли Вы что-то как использование команды копии для перезаписи файла, как который Вы делаете что-то:

echo Y | copy foo.log c:\backup\

кроме того, удостоверьтесь, что Вы используете полные пути для пакетных команд, и т.д. Если пакетный файл запускает приложение для GUI в своего рода режиме "Console", который может быть проблемой также. Помните, сервисы не имеют "Рабочего стола" (если Вы не включаете, "взаимодействуют с рабочим столом") потянуть любой вид окон или окон сообщения к. В Вашей программе Вы могли бы хотеть открыть stdout и каналы stderr и чтение от них во время выполнения в случае, если Вы получаете любые сообщения об ошибках или что-либо.

WebServices, вероятно, выполняются как учетная запись IUSR или анонимная учетная запись, который когда-либо, так, чтобы могла бы быть проблема для Вас. Если это работает при выполнении его в консоли это - просто первый шаг. :)

я не вспоминаю если Система. Диагностика. доступны только в отладке или нет. Вероятно, не, но некоторые из них мог бы быть. Я должен буду выяснить это для Вас.

Hope это дает Вам некоторое представление.

Larry

3
ответ дан 30 November 2019 в 06:12
поделиться

Следующий шаг, который я сделал бы, должен разжечь отладчик и видеть, можно ли сказать то, на чем ожидает программа. Если Вы - expierenced при отладке в блоке, Вы можете понимать то, что происходит с помощью инструментов как ProcExp, FileMon, и т.д.

Являющийся, окна SERVICE и не веб-сервис, имеют довольно мало значения. Так или иначе Вы попробовали мое предложение установки, "Позволяют Сервису взаимодействовать с рабочим столом"?

, Если Вы являетесь отчаянными, Вы могли бы попытаться запустить cmd.exe вместо своего пакетного файла. Затем с помощью cmd параметров строки cmd.exe у Вас может быть IT, запускают пакетный файл. Это, вероятно, дало бы Вам окно подсказки cmd для просмотра эффективной выходной мощности при включении взаимодействования с рабочим столом.

Для полной справки на cmd.exe, просто введите cmd/? в любой командной строке.

Larry

3
ответ дан 30 November 2019 в 06:12
поделиться

Вот решение. Решение не ясно, потому что я изменил так многих время код, и теперь это работает!

я попытался использовать Учетную запись Пользователя, и это не то, что работало. Используйте LocalSystem. Вот код, которые выполняют, главным образом что Kevin дал мне.

            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.StartInfo.FileName = fileName;
            proc.StartInfo.RedirectStandardError = true;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.UseShellExecute = false;


            proc.Start();
            proc.WaitForExit();
            output1 = proc.StandardError.ReadToEnd();
            proc.WaitForExit();
            output2 = proc.StandardOutput.ReadToEnd();
            proc.WaitForExit();

Спасибо всем, я-проголосую за всех и приму Kevin, так как он помогает мне с начала. Очень странный, потому что это работает теперь...

1
ответ дан 30 November 2019 в 06:12
поделиться

Daok, выглядит, как будто единственной вещью, которую Вы изменили, был период тайм-аута на начальном WaitForExit (). Необходимо ОЧЕНЬ остерегаться этого. Если что-то ДЕЛАЕТ , подвешивают Ваш сервис, он никогда не будет возвращаться (и хорошо, в значительной степени работать как он, был для Вас к настоящему времени.. heh), но это не будет хорошо для конечных пользователей...

Теперь, возможно, что Вы знаете то, что заставляет это зависать, можно отладить его далее и найти полное решение...

, Что, или кружат это в некотором потоке, который можно контролировать, и уничтожают, если он зависает слишком долго.

Просто моя ценность за 2 цента, которая обычно не является много. ;)

1
ответ дан 30 November 2019 в 06:12
поделиться
using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    namespace VG
    {
        class VGe
        {
            [STAThread]
            static void Main(string[] args)
            {
                Process proc = null;
                try
                {                
                    string targetDir = string.Format(@"D:\adapters\setup");//this is where mybatch.bat lies
                    proc = new Process();
                    proc.StartInfo.WorkingDirectory = targetDir;
                    proc.StartInfo.FileName = "mybatch.bat";
                    proc.StartInfo.Arguments = string.Format("10");//this is argument
                    proc.StartInfo.CreateNoWindow = false;
                    proc.Start();
                    proc.WaitForExit();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception Occurred :{0},{1}", ex.Message,ex.StackTrace.ToString());
                }
            }
        }
    }
11
ответ дан 30 November 2019 в 06:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: