2014-01-25 5 views
0

Я пытаюсь перезапустить службу окна от службы же окна с этим кодом:перезапуск службы Windows из той же службы окон

  var psi = new ProcessStartInfo("net.exe", "stop " + serviceName); 
      psi.WindowStyle = ProcessWindowStyle.Hidden; 
      psi.UseShellExecute = true; 
      psi.WorkingDirectory = Environment.SystemDirectory; 
      var st = Process.Start(psi); 
      st.WaitForExit(); 

      psi = new ProcessStartInfo("net.exe", "start " + serviceName); 
      psi.UseShellExecute = true; 
      psi.WindowStyle = ProcessWindowStyle.Hidden; 
      psi.WorkingDirectory = Environment.SystemDirectory; 
      st = Process.Start(psi); 
      st.WaitForExit(); 

Это не работает, но это возможно даже с той же услуги?

Если возможно, то кто-нибудь может предложить, почему это не работает?

+0

Что вы ожидаете, что на самом деле происходит, и что вы сделали, чтобы устранить его до сих пор? –

+0

Ожидаю, что служба перезагрузится. Я не уверен, как перенаправить вывод сетевых команд в файл, чтобы я не знал, что происходит. – dagda1

ответ

0

Я не верю, что есть чистый способ сделать это. Как только вы остановите службу, процесс больше не запускается.

Одно немного грязное решение: Вы можете настроить службу для перезапуска при ошибке (например, при установке/регистрации).

Затем, когда вы хотите перезапустить программно, вы можете выйти из системы с ошибкой, например. по телефону:

Environment.Exit(-1) 

или

Environment.FailFast("Service stopped because...") 

Примечание: Если есть уборщик способ сделать это программно счет служба работает под потребует разрешения, чтобы иметь возможность перезапустить службу.

0

Это не работает, потому что как только вы достигнете середины, выполнение останавливается, так как родительский и дочернего процесса выхода:

/* Running */   var psi = new ProcessStartInfo("net.exe", "stop " + serviceName); 
/* Running */   psi.WindowStyle = ProcessWindowStyle.Hidden; 
/* Running */   psi.UseShellExecute = true; 
/* Running */   psi.WorkingDirectory = Environment.SystemDirectory; 
/* st stops svc */  var st = Process.Start(psi); 
/* both exit */   st.WaitForExit(); 

/* never reached */  psi = new ProcessStartInfo("net.exe", "start " + serviceName); 
/* never reached */  psi.UseShellExecute = true; 
/* never reached */  psi.WindowStyle = ProcessWindowStyle.Hidden; 
/* never reached */  psi.WorkingDirectory = Environment.SystemDirectory; 
/* never reached */  st = Process.Start(psi); 
/* never reached */  st.WaitForExit(); 

Настройка службы в окнах, чтобы перезагрузить себя на неудачу, а затем сделать нечистый выход как предложил @StevieB.

Настройка службы, чтобы перезагрузить себя с задержкой 1000 мс на отказ:

sc failure serviceName reset= 60 actions= restart/1000 
+0

не останавливает svc. – dagda1

+0

@ dagda1: У вас есть тупик. 'net' ждет завершения вашей службы, и вы используете' st.WaitForExit() ', чтобы дождаться окончания' net'. –

0

У вас есть тупик. net ждет вашего обслуживания, и вы используете st.WaitForExit(), чтобы дождаться net.

В конце концов net отказывается ждать и закрывается. Затем вы снова вызываете net. Но ваш сервис никогда не выходил в первую очередь, поэтому второй вызов net видит, что служба уже запущена и ничего не делает.

Наконец, вы возвращаете основной цикл событий службы и видите запрос на остановку, и ваш сервис завершается.

Вы должны иметь возможность написать командный файл с указанными выше командами, вызвать его и вернуться к циклу событий. Затем первый net будет ждать завершения обслуживания, а второй net запустит его снова.

Смежные вопросы