Uygulama İçerisinden Başka Bir Uygulama Tetikleme (System.Diagnostics.Process Class)

Bir uygulama içerisinden başka bir uygulamayı .net fonksiyonları ile kolayca tetikleyebiliriz. Bunun için Process sınıfını kullanıyoruz. Bu sınıf System namespace’inde bulunur. System.dll içerisinde yer aldığından ve system.dll default olarak uygulamamızın referanslarında yer aldığı için  bizim referans göstermemize gerek yoktur.

Bu sınıfı kullanabilmemiz için projemizin using kısmına System.Diagnostics‘i eklememiz gerekmektedir.

using System.Diagnostics;

Process.Start Methodu

Process.Start methodu ile  dizini belirtilmiş uygulama tetiklenmektedir.

Aşağıdaki kod bloğu ile dizini belirtilmiş olan exe tetiklenmektedir.

System.Diagnostics.Process process = new System.Diagnostics.Process();

process.StartInfo.FileName = “D:\\eba.net\\Exeler\\service_restart.exe”;

process.Start();

Windows Servislerini Resetleme

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]);
}
}
}