Yeniden Başlatmak için Windows Hizmetini Kurtarma eylemiyle yükleyin


89

ServiceProcessInstallerVe ServiceInstallersınıflarını kullanarak bir Windows Hizmeti kuruyorum.

ServiceProcessInstallerBaşlangıç ​​türünü, adını vb. Ayarlamak için kullandım . Ancak kurtarma eylemini nasıl Yeniden Başlat olarak ayarlayabilirim?

Servis yüklendikten sonra Servisler yönetim konsoluna gidip servis özelliklerinin kurtarma sekmesindeki ayarları değiştirerek manuel olarak yapabileceğimi biliyorum, ancak kurulum sırasında bunu yapmanın bir yolu var mı?

Service Property Recovery Sekmesi

Yanıtlar:


99

Kurtarma seçeneklerini sc kullanarak ayarlayabilirsiniz . Aşağıdakiler, hizmeti bir hatadan sonra yeniden başlayacak şekilde ayarlayacaktır:

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

Bu, C # 'dan kolayca çağrılabilir:

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
Boşluk içeriyorsa, hizmet adını tırnak içinde eklemeniz gerektiğini unutmayın.
user626528

20
Hizmet yüklendiğinde bunu Yükleyici [] hizmet yükleme işleyicisinden arayacaksanız, bu çağrıyı Hizmet Kontrol Yöneticisinde göründükten hemen sonra yürütecek olan "Gerçekleştirilen" olay işleyicisine ekleyebilirsiniz. "AfterInstall" olay yöneticisine koymayın, çünkü bu hizmet kutuya ilk kurulduğunda çalışmayacaktır.
Contango

@Kevin Visual Studio'nun Kod Analizi, nesnelerin bir defadan fazla atılmaması gerektiğini, process.Close()satırın işe yaramadığını öne sürüyor .
JohnTube

1
@ JohnTube - işlemi kaldırdı.Close () satırı
Kevin

24
Söz diziminin bazılarına tuhaf görünebileceğini reset= 0, ancak doğru ve reset=0yanlış olduğunu unutmayın. Boşlukların doğru kullanımı çok önemlidir, reset=bir argüman, ardından bir boşluk 0.
Liam

12

Birçok denemeden sonra, sc komut satırı uygulamasını kullanarak çözdüm .

İnstallutil ve sc ile toplu iş dosyam var. Toplu iş dosyam şuna benzer:

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 komutunun tam dokümantasyonunu istiyorsanız, şu bağlantıyı izleyin: SC.exe: Hizmet Denetleyicisi ve yüklü hizmetler ile iletişim kurar

Not: Her eşit (=) sembolünden sonra bir boşluk eklemeniz gerekir. Örnek: reset = 300



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.