C#撰寫兩個服務,A服務程式實時檢測B程式,防止B服務被惡意停止
A服務實時檢測B服務,如果B服務停止,就啟動B服務
當然A服務也必須是 永久啟動 的
宣告一下: B程式永久是 后臺運行的程式,沒有界面的
uj5u.com熱心網友回復:
這種程式叫做 watchdog,你用這個關鍵字google去uj5u.com熱心網友回復:
行程守護嗎?B都永久了 也不可能被停止啊..
比如zhudongfangyu.exe 這個服務.. 沒辦法停止的 除非卸載...
你可以搜一下.
uj5u.com熱心網友回復:
服務A是監控行程, 建議用定時器, 每1分鐘檢測一次, 如果沒有服務B 的行程, 立即重啟服務B(可以呼叫bat批處理檔案,比較方便)。或者, 把檢測和重啟寫成 powershell 腳本, 監控服務只執行腳本即可, 這樣有了問題監控行程不需要修改程式, 只改腳本就可以了。
uj5u.com熱心網友回復:
大佬,你就不能掛點有牌面的牌子么?你看看樓上的牌子
uj5u.com熱心網友回復:
咋得啦?樓主,話說,我還真用你這種方式部署在現場。你有啥問題?這個是可行的。uj5u.com熱心網友回復:
相互檢測,相互釋放,服務寫到各自資源檔案里,條件判斷,釋放出來執行就行https://www.cnblogs.com/qiaoke/p/10062673.html
uj5u.com熱心網友回復:
我現在需要的是就是這個 效果的
uj5u.com熱心網友回復:
我也想啊 實力不允許啊.
uj5u.com熱心網友回復:
要搞好復雜嗎?一個服務正常開你的業務需要;另一個服務輪詢檢測1個或多個服務的運行情況,掛了就重啟服務。你這個檢測服務就只干一件事,檢測服務,掛了就開啟,服務啟動方式,開機就重啟。部署在現場的服務,沒有人閑得蛋疼,把你這個檢測服務關閉的,不用去管它。這個很簡單的東西,幾個小時就要搞定的。還沒弄完?這要是人在現場,各路領導催進度,那不急死人。uj5u.com熱心網友回復:
謝謝賜教,我再研究研究
uj5u.com熱心網友回復:
檢測服務代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace StartService
{
public partial class Service1 : ServiceBase
{
//間隔時間
private int nSpacingInterval = 10000;
private string filePath = AppDomain.CurrentDomain.BaseDirectory + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
private string[] ServiceNames = null;
CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
WriteLog("檢查服務已開啟");
nSpacingInterval = Convert.ToInt32(ConfigurationManager.AppSettings["SpacingInterval"]) * 1000;
string strServiceNames = ConfigurationManager.AppSettings["ServiceNameArr"];
ServiceNames = strServiceNames.Split(',');
Task.Factory.StartNew(DoWork, cancelTokenSource.Token);
}
protected override void OnStop()
{
cancelTokenSource.Cancel();
cancelTokenSource.Dispose();
WriteLog("檢查服務已停止");
}
private void DoWork(object arg)
{
while (!cancelTokenSource.IsCancellationRequested) // Worker thread loop
{
for (int i = 0; i < ServiceNames.Length; i++)
{
StartService(ServiceNames[i]);
}
System.Threading.Thread.Sleep(nSpacingInterval);
}
}
/// <summary>
/// 檢查并開啟服務
/// </summary>
/// <param name="serviceName"></param>
private void StartService(string serviceName)
{
using (System.ServiceProcess.ServiceController control = new ServiceController(serviceName))
{
if (control.Status == System.ServiceProcess.ServiceControllerStatus.Stopped)
{
control.Start();
WriteLog(serviceName + "重新啟動");
}
}
}
//寫入txt檔案,用于除錯日志
public void WriteLog(string str)
{
using (StreamWriter sw = File.AppendText(filePath))
{
sw.WriteLine(DateTime.Now.ToString() + ": " + str);
sw.Flush();
}
}
}
}
uj5u.com熱心網友回復:
謝謝賜教,我再整理整理uj5u.com熱心網友回復:
守護行程:A守護B ,B守護A ,互相看守,可以破解,綠盾安全就是這種思路,但是只要注冊表微改一下,就可以輕易拆除兩個守護行程。uj5u.com熱心網友回復:
C#級別就更低了,注冊表都不用動, 運行庫卸載就完事了。uj5u.com熱心網友回復:
windows 服務本身就可以設定為如果停了自動(立刻或者1分鐘之后)重新啟動的模式,也可以使用 sc 等命令列安裝服務時在引數中指定,或者將引數寫到安裝批處理檔案中。守護行程通常是處理控制臺或者表單程式,而不是針對服務的。
uj5u.com熱心網友回復:
這個在什么地方設定
uj5u.com熱心網友回復:
找到你的b服務(run里執行services.msc),點右鍵,屬性,恢復當然啟動方式必須是自動
這些視窗操作是有對應命令陳述句的,自己找找
這樣做,的確很方便,很安全
uj5u.com熱心網友回復:
好的,我再研究研究啊
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/73208.html
標籤:C#
上一篇:正則運算式過濾html注釋內容
下一篇:unity3d C#計分怎么弄
