답변:
실패 후 서비스를 다시 시작하도록 설정하십시오 (제어판에서 서비스를 두 번 클릭하고 해당 탭을 살펴보십시오. 이름을 잊어 버렸습니다). 그런 다음 서비스를 다시 시작하려면 언제든지 전화하십시오 Environment.Exit(1)
(또는 0이 아닌 반환) .OS가 서비스를 다시 시작합니다.
Service.ExitCode = 1
다음 실행할 Service.Stop()
수 있습니다. 이 방법을 사용하면 올바른 종료가 가능하고 다시 시작이 트리거됩니다.
Dim proc As New Process()
Dim psi As New ProcessStartInfo()
psi.CreateNoWindow = True
psi.FileName = "cmd.exe"
psi.Arguments = "/C net stop YOURSERVICENAMEHERE && net start YOURSERVICENAMEHERE"
psi.LoadUserProfile = False
psi.UseShellExecute = False
psi.WindowStyle = ProcessWindowStyle.Hidden
proc.StartInfo = psi
proc.Start()
서비스를 실행중인 사용자 계정에 서비스를 중지했다가 다시 시작할 수있는 권한이 있는지도 확신 할 수 없습니다.
스스로 재시작하는 DOS 명령 프롬프트 인 프로세스를 작성할 수 있습니다.
Process process = new Process();
process.StartInfo.FileName = "cmd";
process.StartInfo.Arguments = "/c net stop \"servicename\" & net start \"servicename\"";
process.Start();
const string strCmdText = "/C net stop \"SERVICENAME\"&net start \"SERVICENAME\"";
Process.Start("CMD.exe", strCmdText);
where SERVICENAME
서비스 이름입니다 (서비스 이름의 공백을 설명하기 위해 큰 따옴표 포함, 그렇지 않으면 생략 할 수 있음).
깨끗하고 자동 재시작 구성이 필요하지 않습니다.
자체 재시작 이유에 따라 다릅니다.
서비스를 주기적으로 정리하는 방법을 찾고 있다면 주기적으로 제거 루틴을 발생시키는 타이머가 서비스에서 실행될 수 있습니다.
장애 발생시 다시 시작하는 방법을 찾고 있다면 서비스 호스트 자체가 설정시 해당 기능을 제공 할 수 있습니다.
왜 서버를 다시 시작해야합니까? 당신은 무엇을 달성하려고합니까?
나는 당신이 독립적 인 서비스를 할 수 있다고 생각하지 않습니다 (Restart를 호출하면 서비스가 중지되어 다시 시작 명령이 중단되고 다시 시작되지 않습니다). 두 번째 .exe (ServiceManager 클래스를 사용하는 콘솔 앱)를 추가 할 수 있으면 독립형 .exe를 시작하고 서비스를 다시 시작한 다음 종료 할 수 있습니다.
다시 생각하면, 서비스를 시작하기 위해 서비스가 예약 된 작업 (예 : 명령 줄 'at'명령을 사용하여)을 등록한 다음 스스로 중지하도록 할 수 있습니다. 아마도 효과가있을 것입니다.
배치 파일 또는 EXE로 셸을 만들 때 문제는 서비스에 외부 앱을 실행하는 데 필요한 권한이 있거나 없을 수 있다는 것입니다.
내가 찾은 가장 깨끗한 방법은 서비스 제어 관리자의 진입 점 인 OnStop () 메서드를 사용하는 것입니다. 그런 다음 모든 정리 코드가 실행되고 중지 코드가 작동한다고 가정하면 정지 소켓이나 다른 프로세스가 없습니다.
이렇게하려면 OnStop 메소드가 오류 코드와 함께 종료하도록 지시하는 플래그를 설정해야합니다. 그런 다음 SCM은 서비스를 다시 시작해야한다는 것을 알고 있습니다. 이 플래그가 없으면 SCM에서 서비스를 수동으로 중지 할 수 없습니다. 또한 오류가 발생하면 서비스를 다시 시작하도록 설정했다고 가정합니다.
내 정지 코드는 다음과 같습니다.
...
bool ABORT;
protected override void OnStop()
{
Logger.log("Stopping service");
WorkThreadRun = false;
WorkThread.Join();
Logger.stop();
// if there was a problem, set an exit error code
// so the service manager will restart this
if(ABORT)Environment.Exit(1);
}
서비스에 문제가 발생하여 다시 시작해야하는 경우 SCM에서 서비스를 중지시키는 스레드를 시작합니다. 이를 통해 서비스 자체를 정리할 수 있습니다.
...
if(NeedToRestart)
{
ABORT = true;
new Thread(RestartThread).Start();
}
void RestartThread()
{
ServiceController sc = new ServiceController(ServiceName);
try
{
sc.Stop();
}
catch (Exception) { }
}
그냥 전달 : 그리고 추가 정보를 추가 할 것이라고 생각했습니다 ...
또한 예외를 던질 수 있습니다. 그러면 Windows 서비스가 자동으로 닫히고 자동 다시 시작 옵션이 시작됩니다.이 문제의 유일한 문제는 PC에 개발 환경이 있으면 JIT가 시작하려고한다는 것입니다. 디버그 Y / N이라는 메시지가 나타납니다. 아니오라고 말하면 닫히고 올바르게 다시 시작됩니다. (JIT가없는 PC에서는 모두 작동합니다). im trolling 이유는이 JIT가 Win 7 (XP 등에서 잘 작동하는 데 익숙 함)에 새로 도입되었고 JIT를 비활성화하는 방법을 찾으려고 노력하고 있기 때문입니다 .... 나는 여기에 언급 된 Environment.Exit 방법을 시도 할 수 있습니다. 그것도 작동합니다.
크리스티안 : 브리스톨, 영국
다음과 같이 restart.bat 파일을 작성하십시오.
@echo on
set once="C:\Program Files\MyService\once.bat"
set taskname=Restart_MyService
set service=MyService
echo rem %time% >%once%
echo net stop %service% >>%once%
echo net start %service% >>%once%
echo del %once% >>%once%
schtasks /create /ru "System" /tn %taskname% /tr '%once%' /sc onstart /F /V1 /Z
schtasks /run /tn %taskname%
그런 다음 % service %가 시작될 때 % taskname % 작업을 삭제하십시오.
응용 프로그램 코드를 호스팅 할 별도의 appdomain을 만듭니다. 다시 시작해야하는 경우 프로세스 (Windows 서비스) 대신 앱 도메인을 언로드했다가 다시로드 할 수 있습니다. 이것은 IIS 응용 프로그램 풀이 작동하는 방식이며, asp.net 응용 프로그램을 직접 실행하지 않으며 별도의 appdmain을 사용합니다.
가장 쉬운 방법은 다음과 같은 배치 파일을 갖는 것입니다.
순 정지 순 시작
원하는 시간 간격으로 스케줄러에 파일을 추가하십시오.
private static void RestartService(string serviceName)
{
using (var controller = new ServiceController(serviceName))
{
controller.Stop();
int counter = 0;
while (controller.Status != ServiceControllerStatus.Stopped)
{
Thread.Sleep(100);
controller.Refresh();
counter++;
if (counter > 1000)
{
throw new System.TimeoutException(string.Format("Could not stop service: {0}", Constants.Series6Service.WindowsServiceName));
}
}
controller.Start();
}
}