C#’ta Servis Kontrolü ve Loglama

Sık kullandığımız ve sürekli açık kalmasını istediğimiz servislerin (hata sonucu bildirim vermeden kapanma durumları için) açık olup olmadığını kontrol etmek için c#’ta örnek bir program yazalım. Bu yazıda sık kullandığım ve bazen kendiliğinden kapanan MailEnable’ın MTA servisi için kontrol ve loglama yapan bir program yazacağız. Tüm program kodları aşağıda verilmiştir.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Proje
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        protected override void OnResize(EventArgs ea)
        {
            Invalidate();
            if (WindowState == FormWindowState.Minimized)
            {
                this.Hide();
            }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }
        private void NotifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            Show();
            this.WindowState = FormWindowState.Normal;
            notifyIcon1.Visible = true;
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {

            while (true)
            {
                ServiceController sc = new ServiceController("MEMTAS");
                if ((sc.Status.Equals(ServiceControllerStatus.Stopped)) ||
                     (sc.Status.Equals(ServiceControllerStatus.StopPending)))
                {
                    File.AppendAllText("log.txt", "!!!!!!!! Mail Transfer Agent hizmeti durmuş başlatılıyor. Tarih: " + DateTime.Now + Environment.NewLine);
                    sc.Start();
                    
                }
                else
                {
                    File.AppendAllText("log.txt", "Mail Transfer Agent hizmeti çalışıyor. Tarih: " + DateTime.Now + Environment.NewLine);
                }

                Thread.Sleep(10000);
            }

        }
    }
}

Programımızın kodlarını adım adım inceleyelim.

 protected override void OnResize(EventArgs ea)
        {
            Invalidate();
            if (WindowState == FormWindowState.Minimized)
            {
                this.Hide();
            }
        }

Yukarıdaki kodda programımızı sistem tepsisine simge olarak küçültsün ve programı gizlesin komutunu verdik. Programı aşağı indirdiğimiz zaman otomatik olarak programın main formu gizlenecek ve sistem tepsisinde simge olarak gözücektir yani arka planda hala çalışıyor olacaktır.

 private void Form1_Load(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }

Bu kodda ise main formumuz yani programımızı açtığımız zaman oluşturduğumuz background workerı çalıştırdık.

private void NotifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            Show();
            this.WindowState = FormWindowState.Normal;
            notifyIcon1.Visible = true;
        }

Bu kodda programımız sistem tepsisine küçüldüğünde simgeye tıkladığımızda tekrar programı göstermesini sağladık.

  private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {

            while (true)
            {
                ServiceController sc = new ServiceController("MEMTAS");
                if ((sc.Status.Equals(ServiceControllerStatus.Stopped)) ||
                     (sc.Status.Equals(ServiceControllerStatus.StopPending)))
                {
                    File.AppendAllText("log.txt", "!!!!!!!! Mail Transfer Agent hizmeti durmuş başlatılıyor. Tarih: " + DateTime.Now + Environment.NewLine);
                    sc.Start();
                    
                }
                else
                {
                    File.AppendAllText("log.txt", "Mail Transfer Agent hizmeti çalışıyor. Tarih: " + DateTime.Now + Environment.NewLine);
                }

                Thread.Sleep(10000);
            }

        }

Bu kodla background workerimizin yapacağı işlemler için bir fonksiyon oluşturduk. while (true) döngüsüyle program çalıştığı sürece döngü içerisindeki kodların tekrar tekrar çalışmasını sağladık.

ServiceController sc = new ServiceController("MEMTAS");
                if ((sc.Status.Equals(ServiceControllerStatus.Stopped)) ||
                     (sc.Status.Equals(ServiceControllerStatus.StopPending)))
                {
                    File.AppendAllText("log.txt", "!!!!!!!! Mail Transfer Agent hizmeti durmuş başlatılıyor. Tarih: " + DateTime.Now + Environment.NewLine);
                    sc.Start();
                    
                }
                else
                {
                    File.AppendAllText("log.txt", "Mail Transfer Agent hizmeti çalışıyor. Tarih: " + DateTime.Now + Environment.NewLine);
                }

Bu kodla memtas isimli (MailEnable MTA servisi) servis durmuş ise bu bilgiyi log.txt dosyasına kaydet ve servisi yeniden başlat eğer servis çalışıyorsa log.txt isimli dosyaya servisin çalıştığı bilgisini kaydetmesini sağladık. Thread.Sleep(10000); komutuyla kodların çalışması döngü sonuna geldiğinde 10 saniye beklesin kısaca döngü 10 saniyede bir çalışsın komutunu vermiş olduk.

Sonuç olarak resimde görüldüğü gibi programımız her 10 saniyede bir servisi kontrol ediyor ve loglama işlemini başarıyla gerçekleştiriyor.

Yorum yapın