Geliştirdiğimiz uygulama Windows servislerine yada kendi geliştirdiğimiz bir servise bağımlı ise uygulamamızın çalışır durumda ayakta kalabilmesi, bu servislerin durumuna bağlı oluyor. Servisler uygulama için hayati önem arzediyorsa, schedule edilmiş harici bir exe ile bu servisler kontrol edilip durmuş servisler başlatılabilir yada belirlediğimiz servisler restart edilebilir.
Servisler üzerinde işlem yapabilmek için ServiceController sınıfını kullanırız. Bu sınıf System.ServiceProcess namespace’inde bulunur. ServiceController sınıfını kullanabilmemiz için projemize System.ServiceProcess.dll dosyasını referans olarak eklememiz gerekmektedir.
System.ServiceProcess.dll Download
Sonrasında projemizin using kısmına System.ServiceProcess‘i eklememiz gerekmektedir.
using
System.ServiceProcess;
Service Controller Status Özelliği
Status özelliğini kullanarak sorguladığımız servis hakkında bilgi sahibi olabiliriz. Status özelliği ServiceControllerStatus, enum tipinde değer döndürür.
|
Statü Adı |
Açıklama |
|
ContinuePending |
Servis durdurulmuş ve başlatılıyor. |
|
Paused |
Servis durdurulmuş. |
|
PausePending |
Servis durduruluyor. |
|
Running |
Servis çalışıyor. |
|
StartPending |
Servis başlatılıyor. |
|
Stopped |
Servis çalışmıyor. |
|
StopPending |
Servis durduruluyor. |
Uzak Makinadaki Bir Servisin Durumunu Belirleme
Aşağıdaki kod bloğu ile “UzakSunucuAdı” isimli uzak sunucudaki “servisadı” isimli servisin çalışırlığı kontrol edilir. Eğer kontrol edilen servis local bir sunucu ise 2. parametre olan uzak sunucu adı yazmaya gerek kalmaz.
ServiceController service =
new
ServiceController(
"servisadı"
,
"UzakSunucuAdı"
);
if
(service .Status == ServiceControllerStatus.Running)
{
MessageBox.Show(
"Servis Çalışıyor"
);
}
Servisleri Restart Etme
Belirlediğimiz servisleri bir döngü ile önce stop edip sonra tekrar start ederek restart edebiliriz. Stop komutu verildikten sonra statü “Stopped” olana kadar beklenir. Ardından Start komutu verilir ve tekrar statü “Running” olana kadar beklenir. Bu işlemin ardından ilgili servis restart edilmiş olur.
Aşağıdaki kod bloğu srvc dizisi içerisinde tanımlanmış servisleri restart etmektedir.
public void service_restart()
{
string[] srvc = { “servicename1”, “servicename2”, “servicename3″ };
for (int i = 0; i < srvc .Length; i++)
{
ServiceController service = new ServiceController(srvc [i],);
TimeSpan timeout = TimeSpan.FromMilliseconds(30000);
try
{
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
Console.WriteLine(srvc[i] + ” Servisi Durduruldu”);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message + ” Servis Durdurma Hatası. Servis Adı: ” + subservice[i]);
}
try
{
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
Console.WriteLine(subservice[i] + ” Servisi Başlatıldı”);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + ” Servis Başlatma Hatası Servis Adı: ” + subservice[i]);
}
}
}