ติดตั้ง Windows Service พร้อมการดำเนินการกู้คืนเพื่อรีสตาร์ท


89

ฉันกำลังติดตั้งบริการ Windows โดยใช้ServiceProcessInstallerและServiceInstallerคลาส

ฉันใช้ServiceProcessInstallerเพื่อตั้งค่าประเภทการเริ่มต้นชื่อ ฯลฯ แต่ฉันจะตั้งค่าการดำเนินการกู้คืนเป็นรีสตาร์ทได้อย่างไร

ฉันรู้ว่าฉันสามารถทำได้ด้วยตนเองหลังจากติดตั้งบริการแล้วโดยไปที่คอนโซลการจัดการบริการและเปลี่ยนการตั้งค่าบนแท็บการกู้คืนของคุณสมบัติของบริการ แต่มีวิธีดำเนินการในระหว่างการติดตั้งหรือไม่

แท็บการกู้คืนทรัพย์สินบริการ

คำตอบ:


99

คุณสามารถตั้งค่าตัวเลือกการกู้โดยใช้SC ต่อไปนี้จะตั้งค่าบริการให้รีสตาร์ทหลังจากเกิดความล้มเหลว:

sc failure [servicename] reset= 0 actions= restart/60000

สามารถเรียกได้ง่ายจาก C #:

static void SetRecoveryOptions(string serviceName)
{
    int exitCode;
    using (var process = new Process())
    {
        var startInfo = process.StartInfo;
        startInfo.FileName = "sc";
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;

        // tell Windows that the service should restart if it fails
        startInfo.Arguments = string.Format("failure \"{0}\" reset= 0 actions= restart/60000", serviceName);

        process.Start();
        process.WaitForExit();

        exitCode = process.ExitCode;
    }

    if (exitCode != 0)
        throw new InvalidOperationException();
}

4
โปรดทราบว่าคุณต้องใส่ชื่อบริการในเครื่องหมายคำพูดหากมีช่องว่าง
user626528

20
หากคุณกำลังจะเรียกสิ่งนี้จากตัวจัดการการติดตั้งบริการ Installer [] ใน C # เมื่อบริการติดตั้งคุณสามารถแทรกการเรียกนี้ลงในตัวจัดการเหตุการณ์ "Committed" ซึ่งจะดำเนินการหลังจากที่บริการปรากฏใน Service Control Manager อย่าใส่ไว้ในตัวจัดการเหตุการณ์ "AfterInstall" เนื่องจากจะใช้ไม่ได้ในครั้งแรกที่ติดตั้งบริการบนกล่อง
Contango

การวิเคราะห์โค้ดของ @Kevin Visual Studio ชี้ให้เห็นว่าไม่ควรกำจัดวัตถุมากกว่าหนึ่งครั้งprocess.Close()เส้นจะไร้ประโยชน์
JohnTube

1
@ JohnTube - ลบกระบวนการออกสาย Close ()
Kevin

24
โปรดทราบว่าไวยากรณ์อาจดูแปลกสำหรับบางคน แต่reset= 0ถูกต้องและreset=0ไม่ถูกต้อง การใช้งานที่ถูกต้องของพื้นที่เป็นสิ่งสำคัญเป็นหนึ่งในอาร์กิวเมนต์ตามด้วยช่องว่างแล้วreset= 0
Liam

12

หลังจากหลาย ๆ เสียงฉันแก้ไขโดยใช้แอพบรรทัดคำสั่งsc

ฉันมีไฟล์แบตช์พร้อม installutil และ sc ไฟล์แบตช์ของฉันคล้ายกับ:

installutil.exe "path to your service.exe"
sc failure "your service name" reset= 300 command= "some exe file to execute" actions= restart/20000/run/1000/reboot/1000

หากคุณต้องการเอกสารฉบับเต็มของคำสั่ง sc ให้ไปที่ลิงค์นี้: SC.exe: สื่อสารกับ Service Controller และบริการที่ติดตั้ง

หมายเหตุ: คุณต้องเพิ่มช่องว่างหลังสัญลักษณ์ (=) ที่เท่ากัน ตัวอย่าง: reset = 300


9

2

ฉันพบโครงการต่อไปนี้ซึ่งดูแลการตั้งค่าเหล่านี้โดยใช้รหัสและการเรียก Win API เท่านั้น:
http://code.msdn.microsoft.com/windowsdesktop/CSWindowsServiceRecoveryPro-2147e7ac


ลิงก์ของคุณเสีย! คำตอบเฉพาะลิงก์ไม่ดี!
AaA

ลิงค์ใช้งานได้และนี่คือทางออกที่ดีที่สุด ทำงานได้โดยไม่ต้องเริ่มกระบวนการ
Piedone
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.