어떻게 c\#를 이용 하여 유 니 버 설 데 몬 을 실현 합 니까?
원본 다운로드: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());
}
}
}
총결산이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.