어떻게 c\#를 이용 하여 유 니 버 설 데 몬 을 실현 합 니까?

1.다운로드
원본 다운로드:http://files.cnblogs.com/tianzhiliang/CocoWatcher.rar
패키지 다운로드:http://files.cnblogs.com/tianzhiliang/CocoWatcher_Setup.rar
       로 컬 다운로드:http://xiazai.jb51.net/201910/yuanma/CocoWatcher(jb51net).rar
2.설치 주의사항
설정 파일 에 지 킬 프로그램 을 설정 합 니 다.프로그램 사 이 를 쉼표 로 구분 합 니 다.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <appSettings>
 <add key="ProcessAddress" value="
 d:\war3.exe,
 d:
ote.txt, d:\girl.jpg " /> </appSettings> </configuration>
이 항목 은 윈도 서비스 입 니 다."CocoWatcher.exe"를 직접 열 면 오류 가 발생 합 니 다.그림 1 참조:

이 데 몬 을 실행 하려 면 Windows 서 비 스 를 설치 하고 일괄 처리 문서 인'설치.bat'를 클릭 하면 됩 니 다.'설치.bat'의 구체 적 인 내용 은 다음 과 같 습 니 다.

"%cd%\InstallUtil.exe" "%cd%\CocoWatcher.exe"
net start "CocoWatcher"
pause
이 데 몬 을 마 운 트 해제 하려 면 일괄 처리 문서'마 운 트 해제.bat'를 누 르 십시오.'마 운 트 해제.bat'의 구체 적 인 내용 은 다음 과 같 습 니 다.

net stop "CocoWatcher"
"%cd%\InstallUtil.exe" "%cd%\CocoWatcher.exe" -u
taskkill /f /im CocoWatcher.exe
pause
3.수요 분석
사용자 가 지 킬 프로그램(수량 제한 없 음)을 지정 합 니 다.이 프로그램 은 exe 실행 가능 한 파일 뿐만 아니 라 jpg,txt 등 실행 가능 한 모든 프로그램 도 포함 합 니 다.사용자 가 지 킬 프로그램 을 설정 한 후 프로그램 을 닫 습 니 다(합 법 적 이 고 불법 으로 닫 는 것 포함).이 프로그램 은 즉시 다시 열 수 있어 야 합 니 다.컴퓨터 가 다시 시작 되면 지 켜 야 할 프로그램 도 자동 으로 모두 열 립 니 다.
4.상세 설계
상기 수 요 를 실현 하려 면 먼저 사용자 가 지 킬 프로그램 을 마음대로 설정 할 수 있 도록 설정 파일 을 제공 해 야 합 니 다.그렇다면 이 프로필 은 프로그램의 어떤 정 보 를 설정 해 야 합 니까?정 답:응용 프로그램의 전체 경로.
자,지 켜 야 할 프로그램의 모든 경 로 를 알 고 있 습 니 다.다음은 어떻게 지 켜 야 할 까요?우선,작업 관리 자 를 열 어 실행 중인 프로 세 스 가 어떤 프로 세 스 가 있 는 지 확인 한 다음 에 이 프로 세 스 의 전체 경 로 를 하나씩 읽 고 지 켜 야 할 프로그램의 전체 경로 와 비교 해 야 합 니 다.일치 하면 지 켜 야 할 프로그램 이 열 렸 음 을 설명 합 니 다.이 때 프로 세 스 핸들 을 할당 하여 정 보 를 되 돌려 야 합 니 다.프로 세 스 가 종료 되 었 음 을 설명 합 니 다.프로 세 스 핸들 메모 리 를 풀 고 프로 세 스 를 다시 시작 합 니 다.작업 관리 프로 세 스 목록 에 있 는 모든 프로 세 스 를 옮 겨 다 니 며 지 킬 프로그램의 전체 경로 와 일치 하 는 프로 세 스 를 찾 지 못 하면 지 킬 프로그램 이 열 리 지 않 았 음 을 설명 합 니 다.이 때 이 프로그램 을 시작 하고 모니터링 프로 세 스 로 넘 어가 야 합 니 다.
주의해 야 할 것 은 지 켜 야 할 프로그램 을 감시 하기 위해 스 레 드 를 추가 로 배정 해 야 한 다 는 점 이다.왜?주 스 레 드(입구 함수 스 레 드)로 모니터링 작업 을 수행 하면 프로 세 스 가 종료 되 어야 활성화 되 기 때문에 후속 프로그램 을 실행 할 수 없습니다.게다가 감시 프로그램 은 지속 적 인 감 시 를 실현 하려 면 사 순환 을 사용 해 야 한다.만약 에 메 인 스 레 드 가 사 순환 에 들 어가 면 다른 지 켜 야 할 프로 세 스 를 감시 할 수 없다.
5.코드 상세 설명
윈도 서비스의 개발 절 차 는 MSDN 을 참고 하여 생략 하 십시오.다음은 핵심 코드 를 붙 여 설명 하 겠 습 니 다.
설정 파일 의'ProcessAddress'노드 를 읽 고 지 킬 프로그램의 전체 디 렉 터 리 를 가 져 오 며 프로그램의 전체 디 렉 터 리 를 검증 합 니 다.합 법 적 이면 스 캔 작업 관리자 프로 세 스 목록 프로 세 스 에 들 어 갑 니 다.

/// <summary>
///     
/// </summary>
private void StartWatch()
{
 if (this._processAddress != null)
 {
 if (this._processAddress.Length > 0)
 {
 foreach (string str in _processAddress)
 {
 if (str.Trim() != "")
 {
  if (File.Exists(str.Trim()))
  {
  this.ScanProcessList(str.Trim());
  }
 }
 }
 }
 }
}
작업 관리 자 를 열 고 실행 중인 프로 세 스 가 어떤 프로 세 스 인지 확인 한 다음 이 프로 세 스 의 전체 경 로 를 하나씩 읽 고 지 켜 야 할 프로그램의 전체 경로 와 비교 합 니 다.일치 하면 지 켜 야 할 프로그램 이 열 렸 음 을 설명 하고 모니터링 프로 세 스 에 들 어 갑 니 다.작업 관리 프로 세 스 목록 에 있 는 모든 프로 세 스 를 옮 겨 다 니 며 지 킬 프로그램의 전체 경로 와 일치 하 는 프로 세 스 를 찾 지 못 하면 지 킬 프로그램 이 열 리 지 않 았 음 을 설명 합 니 다.이 때 이 프로그램 을 시작 하고 모니터링 프로 세 스 로 넘 어가 야 합 니 다.

/// <summary>
///       ,                   
///     ,       
///      ,        
/// </summary>
/// <param name="strAddress"></param>
private void ScanProcessList(string address)
{
 Process[] arrayProcess = Process.GetProcesses();
 foreach (Process p in arrayProcess)
 {
 //System、Idle           
 if (p.ProcessName != "System" && p.ProcessName != "Idle")
 {
 try
 {
 if (this.FormatPath(address) == this.FormatPath(p.MainModule.FileName.ToString()))
 {
  //     
  this.WatchProcess(p, address);
  return;
 }
 }
 catch
 {
 //          
 this.SaveLog("  (" + p.Id.ToString() + ")(" + p.ProcessName.ToString() + ")       !");
 }
 }
 }
 
 //      
 Process process = new Process();
 process.StartInfo.FileName = address;
 process.Start();
 this.WatchProcess(process, address);
}
스 레 드 를 할당 하여 모니터링 작업 을 수행 합 니 다:

 /// <summary>
 ///     
 /// </summary>
 /// <param name="p"></param>
 /// <param name="address"></param>
 private void WatchProcess(Process process, string address)
 {
 ProcessRestart objProcessRestart = new ProcessRestart(process, address);
 Thread thread = new Thread(new ThreadStart(objProcessRestart.RestartProcess));
 thread.Start();
 }
 
 
public class ProcessRestart
{
 //  
 private Process _process;
 private string _address;
 
 
 /// <summary>
 ///     
 /// </summary>
 public ProcessRestart()
 {}
 
 
 /// <summary>
 ///     
 /// </summary>
 /// <param name="process"></param>
 /// <param name="address"></param>
 public ProcessRestart(Process process, string address)
 {
 this._process = process;
 this._address = address;
 }
 
 
 /// <summary>
 ///     
 /// </summary>
 public void RestartProcess()
 {
 try
 {
 while (true)
 {
 this._process.WaitForExit();
 this._process.Close(); //          
 this._process.StartInfo.FileName = this._address;
 this._process.Start();
 
 Thread.Sleep(1000);
 }
 }
 catch (Exception ex)
 {
 ProcessWatcher objProcessWatcher = new ProcessWatcher();
 objProcessWatcher.SaveLog("RestartProcess()   ,          ("
 + this._process.Id.ToString() +")(" + this._process.ProcessName.ToString() 
 + ")   ,     :" + ex.Message.ToString());
 }
 }
}
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기