Windows Servisleri (Windows Services)

Eyl 06, 2013

Windows servisleri bilgisayarın açılmasıyla birlikte kendini otomatik olarak başlatan, herhangi bir arayüzü veya görsel çıktısı olmadan işletim sisteminin arka planında çalışan, kullanıcıyla sürekli etkileşim halinde bulunan çalıştırılabilir nesnelerdir. Bu servisler işletim sistemlerinde çok önemli görevler üstlenmişlerdir. Sistem olaylarının ve hatalarının kayıtlarının tutulmasında, veritabanı güncellemelerinde, performans ölçümlerinde, veri analizlerinde, kaynakların ve network (ağ) erişimlerinin izlenmesi gibi pek çok konuda kullanılırlar. Herhangi bir işletim sisteminde çalışan birçok servis vardır. Bu servisler Control Panel (Denetim Masası ) ->Administrative Tools (Yönetim Araçları) -> Services (Servisler) yolu izlenerek görülebilir. 

Aynı zamanda kullanıcılar kendi ihtiyaçları doğrultusunda .Net Framework içerisinde tanımlanmış olan sınıfları kullanarak kendi servislerini oluşturabilirler. Buradaki sınıfları kullanarak bir servis oluşturulmak istenildiğinde uygulanması gereken bazı kurallar vardır. Öncelikle bir servisin uygulama amacına hizmet edecek şekilde oluşturulması gerekir, daha sonra sistemde bu servis için bir iş parçacığı oluşturulmalı ve servis sisteme yüklenmelidir. Sisteme yüklenen bu servisin, aldığı durumlarServiceController (Servis Denetleyicisi) sınıfındaki metotlar aracılığıyla kontrol edilebilir. Bir servis çalışırken oluşan hatalar sistemde log (kayıt) olarak tutulur. Aynı zamanda bu sınıftaki metotlar kullanılarak loglar aracılığıyla servislerin davranışları kontrol edilebilir.

Aşağıda Microsoft Visual Studio 2010 ile bir Web Servis projesinin oluşturulması için aşağıdaki adımlar izlenir.

  1. Öncelikle File (Dosya) -> New (Yeni)-> Project (Proje) dizini açıldığında açılan pencerede kırmızı ile işaretli alanlar seçilir ve OK (Tamam) düğmesine tıklanır.



  2. Burada OK (Tamam) düğmesine tıklandıktan sonra aşağıdaki gibi bir ekran çıkar. .Net tarafından oluşturulmuş servis kodlarının görülmesi için click here toswitch to code view (kod görünümüne geç) bağlantısına tıklanılması gerekir.

Bu adımlardan sonra ekrana ServiceBase (Temel Servis) sınıfından türemiş bir sınıf ile OnStart (Başlangıç) ve OnStop (Bitiş) adında iki tane protected (korunmuş)metot gelir. Bunlardan "OnStart" metodu servis çalışmaya başladığı anda tetiklenirken, "OnStop" metodu ise servis durduğunda tetiklenir.

Bunların dışında OnPause (Durdur) ve OnContinue (Devam Et) olmak üzere servisin davranışını kontrol eden iki tane daha servis metotu vardır. Bu metotların dışında dikkat edilmesi gereken bir diğer nokta da Service1 isimli sınıfın main (ana) metodundaki kodlardır.  Burada ServiceBase (Temel Servis) sınıfı tipinden bir nesne dizisi olarak tanımlanmış bu dizinin ilk elemanı "Service1" ismi ile oluşturulmuştur. Son olarak ise "ServiceBase" sınıfının Run (Çalıştır) metodu parametre olarak aldığı servisleri eğer başlatılmış iseler belleğe yüklemekle görevlidir. Bir servis ilk kez oluşturulduğunda servisteki Autolog (Otomatik Kayıt) özelliği değeri true(evet) olarak gelir. Bu özellik servis uygulamasına ait kayıtların Application Log (Uygulama Kayıtları)'na otomatik olarak kayıt edilmesini sağlar. Eğer özel kayıtlar tutulmak istenirse bu özellik false (hayır) olarak değiştirilir.

Servislerin nasıl çalıştıklarını anlama açısından "OnStart" ve "OnStop" metotlarına metin eklenerek aşağıdaki gibi bir kod yazılmıştır:

namespace WindowsService1
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        } 

        protected override void OnStart(string[] args)
        {

        FileStream dosyaAc = new FileStream(@"c:\temp\WindowsService.txt",
        FileMode.OpenOrCreate, FileAccess.Write);
        StreamWriter dosyaYaz = new StreamWriter(dosyaAc); 
        dosyaYaz.BaseStream.Seek(0, SeekOrigin.End); 
        dosyaYaz.WriteLine(" WinsowsService baslatıldı.\n"); 
        dosyaYaz.Flush();dosyaYaz.Close(); 
        }

        protected override void OnStop() 
              {

        FileStream dosyaAc = new FileStream(@"c:\temp\WindowsService.txt",
        FileMode.OpenOrCreate, FileAccess.Write);
        StreamWriter dosyaYaz = new StreamWriter(dosyaAc);
        dosyaYaz.BaseStream.Seek(0, SeekOrigin.End);
        dosyaYaz.WriteLine(" WindowsService durduruldu. \n"); 
        dosyaYaz.Flush();
        dosyaYaz.Close(); 
        } 
    }
}

Yukarıdaki kod parçası "Service1.cs" dosyasına ait olup diğer dosyalar üzerinde herhangi bir değişiklik yapılmamıştır. Bu kod parçaları eklendikten sonra  yazılmış olan bu servis sisteme yüklenmelidir. Bunun için ilgili yükleme nesnelerinin yazılan kod parçasına eklenilmesi gerekir. Aşağıdaki adımlar izlenerek bu işlem gerçekleştirilebilir.

  1. Design (Dizayn) görünümünde sağ tuşa tıklanıldığında Add Installer (Yükleme nesnesi ekle) seçeneği seçilir.



  2. Bunlar eklendikten sonra servis çalışmaya hazır durumdadır. Aynı zamanda aşağıdaki gibi Properties (Özellikler) penceresinden process (işlem)'in görünen yüzü de değiştirilebilir.

Bundan sonra servis uygulaması derlenir ve InstallUtil (Yükleme Aracı) ile servis sisteme yüklenir. "InstallUtil" aracı servisi sisteme yüklerken servis uygulamasına önceden eklenilen ServiceProcessInstaller (Servis İşlem Yükleyicisi) ve ServiceInstaller (Servis Yükleyicisi) sınıflarını kullanır. Bu işlemin ardından vs.net ortamında,Server Explorer (Sunucu Gezgini) ile servislere bakıldığında, "Service1" isimli servisin yüklendiği ancak henüz çalıştırılmadığı görülür. Servis, yine Server Explorer penceresinden servis adına sağ tıklayıp açılan menüden start (başlat) komutuna tıklanarak çalıştırılabilir. Servis çalıştırdıktan sonra, yine Server Explorer penceresinden Event Logs (Olay Kayıtları) sekmesine bakıldığında, bahsedilen olay kayıtları dışında tutulan kayıtlar da görülebilir.