Windows 서비스가 프로그램 방식으로 재시작하려면 어떻게 해야 합니까?
로 로버스트 코드를 쓸 필요가 있습니다.NET: Windows 서비스(서버 2003)가 자동적으로 재기동할 수 있도록 합니다.어떻게 하면 좋을까요?있나요?NET API를 사용할 수 있습니까?
장애 발생 후 서비스를 재시작하도록 설정합니다(컨트롤 패널에서 서비스를 더블 클릭하여 해당 탭을 둘러봅니다. (미국의 후,는, 「」에 전화하기만 .Environment.Exit(1)OS를 사용합니다.
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()
서비스를 실행 중인 사용자 계정에 서비스를 중지하고 다시 시작할 수 있는 권한도 있는지 확인할 수 없습니다.
를 할 수 .cmd.exe
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);
서 ''는SERVICENAME는 서비스 이름입니다(서비스명의 공백을 설명하기 위해 큰따옴표가 포함되어 있습니다.을 참조해 주세요.
클린, 자동 재기동 설정은 불필요합니다.
그 이유는, 자동적으로 재기동하는 이유에 따라 다릅니다.
서비스 자체를 정기적으로 청소하는 방법을 찾고 있는 경우 정기적으로 삭제 루틴을 발생시키는 서비스 내에서 타이머를 실행할 수 있습니다.
장애가 발생했을 때 재기동하는 방법을 찾고 있는 경우는, 서비스 호스트 자신이 셋업시에 그 기능을 제공할 수 있습니다.
그럼 서버를 재부팅해야 하는 이유는 무엇입니까?당신은 무엇을 달성하려고 합니까?
자급식 서비스에서는 할 수 없다고 생각합니다(Restart를 호출하면 서비스가 중지되고 Restart 명령이 중단되어 다시 시작되지 않습니다).두 번째 .exe(ServiceManager 클래스를 사용하는 콘솔응용 프로그램)를 추가할 수 있는 경우 스탠드아론 .exe를 실행하여 서비스를 재시작한 후 종료할 수 있습니다.
다시 한 번 생각해 보면, (예를 들어 명령줄 'at' 명령어를 사용하여) 스케줄링된 작업을 서비스에 등록하고 서비스를 시작한 후 자동으로 중지하도록 할 수 있습니다.그것은 아마 효과가 있을 것입니다.
배치 파일 또는 EXE에 셸아웃할 때의 문제는 서비스에 외부 앱을 실행하는 데 필요한 사용 권한이 있을 수도 있고 없을 수도 있다는 것입니다.
이를 위한 가장 깨끗한 방법은 Service Control Manager의 엔트리 포인트인 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 Scheduler를 사용하여 서비스 재시작을 예약합니다.문제는 스스로 재기동할 수는 없지만, 스스로 정지할 수는 있다는 것입니다.(당신이 앉아 있는 나뭇가지를 톱으로 자르고 있는 것입니다)다른 프로세스가 필요합니다.Windows Scheduler가 적절한 것입니다.(서비스 자체에서라도) 즉시 실행되도록 서비스를 재시작하는 일회성 작업을 스케줄링합니다.
그렇지 않으면 귀하를 위해 "셰핑" 프로세스를 생성해야 합니다.
질문에 대한 첫 번째 답변은 가장 간단한 해결책입니다. "환경입니다.Exit (1)" Windows Server 2008 R2에서 사용하고 있는 것으로, 정상적으로 동작합니다.서비스가 자동으로 중지되고 O/S가 1분간 대기한 후 재시작합니다.
안 될 것 같아요.서비스가 "정지"되면 완전히 언로드됩니다.
좋아, 내 생각엔 항상 방법이 있는 것 같아.예를 들어 분리된 프로세스를 생성하여 서비스를 중지한 후 재시작한 후 종료할 수 있습니다.
그냥 지나쳤어요. 그리고 정보를 좀 더 추가하려고요...
예외도 설정할 수 있습니다.이것에 의해, Windows 서비스가 자동적으로 닫힙니다.또, 자동 재기동 옵션이 기동하는 유일한 문제는, PC에 개발 환경이 있는 경우, JIT가 기동하려고 하면, 「아니오」라고 하는 프롬프트가 표시되고 나서, 「debug Y/N」이 종료해, 올바르게 재기동합니다.(JIT가 없는 PC에서는 모든 것이 기능합니다).이 JIT가 Windows 7(XP 등에서는 정상적으로 동작하고 있었습니다)에 새로운 JIT이기 때문에, JIT를 무효로 하는 방법을 찾고 있습니다.환경을 시험해 보겠습니다.여기서 설명하는 종료 방법은 그 동작도 확인합니다.
크리스티안 : 영국 브리스톨
다음과 같이 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 서비스) 대신 appdomain을 언로드하고 새로고침할 수 있습니다.IIS 앱 풀은 이렇게 동작하며 asp.net 앱을 직접 실행하는 것이 아니라 별도의 앱메인을 사용합니다.
NT 서비스를 애플리케이션의 래퍼로서 활용하는 것이, 보다 좋은 어프로치가 될 가능성이 있습니다.NT 서비스가 시작되면 응용 프로그램은 "유휴" 모드에서 명령이 시작되기를 기다릴 수 있습니다(또는 자동으로 시작되도록 구성됨).
시동이 걸렸을 때는 아이돌 상태로 시작하여 명령이 전진하거나 후진할 때까지 기다립니다.이것에 의해, 애플리케이션의 표시 방법을 선택할 수 있기 때문에, 리모트 관리의 향상 등, 그 외의 메리트를 얻을 수도 있습니다.
가장 쉬운 방법은 다음과 같은 배치 파일을 사용하는 것입니다.
네트 스톱 네트 스타트
원하는 시간 간격으로 파일을 스케줄러에 추가합니다.
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();
}
}
언급URL : https://stackoverflow.com/questions/220382/how-can-a-windows-service-programmatically-restart-itself
'programing' 카테고리의 다른 글
| 브라우저 창의 높이를 100%로 구분하는 방법 (0) | 2023.04.14 |
|---|---|
| Git에서 로컬 브랜치를 리모트 브랜치로 대체하려면 어떻게 해야 하나요? (0) | 2023.04.14 |
| 명령줄에서 .bash_profile을 새로고침하는 방법 (0) | 2023.04.14 |
| python 스크립트를 실행하는 Windows 컴퓨터의 이름을 가져오고 있습니까? (0) | 2023.04.14 |
| SSIS 패키지를 사용하여 Excel 파일을 루프하여 데이터베이스에 로드하려면 어떻게 해야 합니까? (0) | 2023.04.14 |