Makale Özeti

Bu makalede arkaplanda çalışarak çeşitli işlemler gerçekleştirmek için kullanılan windows servislerini ele alıyor olacağız.

Makale

Windows servisleri arkaplanda çalışan uygulamalardır. Standart uygulamalardan farklı olarak windows servislerinin herhangi bir kullanıcı arayüzü bulunmamaktadır bu nedenle kullanıcı tarafından yönetilmeyecek olan uygulamaların geliştirilmesi için ideal bir platformdur. Diğer platformlar bu yapıyı desteklemedikleri için windows servislerini sadece NT tabanlı işletim sistemlerinde (windows 2000, 2003, xp ve NT) çalıştırabiliriz. Windows servislerini çalıştırmak için spesifik bir windows kullanıcı hesabı tanımlandığından, oturumu açan kullanıcının yetkilerinden farklı yetkilere sahip bir kullanıcı accountu ile de çalıştırılabilir ve herhangi bir kullanıcı oturum açmadan da çalışabilir.

Windows servisleri genellikle gözlemleme amaçlı (veritabanı, registry v.b.), yönetme amaçlı (network bağlantılarını v.b.) ve bilgi toplama, analiz ve kayıt amaçlı işlemlerde kullanılır.

Bilgisayarınızda yüklenmiş olan windows servislerini başlat->çalıştır->services.msc->enter yolunu izleyerek (veya denetim masası->yönetimsel araçlar->Services) listeleyebilir ve yönetebilirsiniz. (Şekil: 1.1)

Windows Servisleri registry’e bir executable olarak kayıt edilir ve “The Service Control Manager” adlı uygulama aracılığıyla yönetilir. Service Control Manager uygulaması ile yerel bilgisayardaki servisleri yönetebildiğiniz gibi, uzak bilgisayarlardaki servisleri de yönetebilirsiniz. (Şekil: 1.2)

Şekil: 1.1 :: Yerel bilgisayardaki Windows Servisleri

Şekil: 1.2 :: Uzak Bilgisayardaki Windows Servislerinin Yönetim 

Windows Service Mimarisi
Windows Service mimarisi üç bileşenden oluşmaktadır.


İstenilen özellikleri sunan bir veya daha fazla servisten oluşan uygulama.


Servisi yönetmemizi sağlayan uygulama.

Bilgisayara yüklenmiş olan servisleri yönetmemizi sağlayan uygulama.

Windows servislerini istediğimiz .NET dili ile geliştirebiliriz. Windows servislerini geliştirmek, bilgisayara yüklemek ve yönetmek için gerekli temel sınıflar System.ServiceProcess namespace’inde yer almaktadır. Oluşturduğumuz windows servislerini, ServiceInstaller ve ServiceProcessInstaller sınıflarının sunduğu metodları kullanarak bilgisayara yükleriz. Bilgisayarda kayıtlı olan tüm windows servislerini HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services registry bloğunda görebilirsiniz.

Windows servisini oluşturup bilgisayara yükledikten sonra başlatmak, durdurmak ve beklemeye almak için Service Control Manager’ı kullanırız. Servisimizin desteklediği özel komutları çalıştırmak içinse ServiceController sınıfının sunduğu metodları kullanırız. Windows servislerinin desteklediği 4 adet durum vardır. Bunlar; running, paused ve stopped durumlarıdır. Dördüncü durum ise, servisin start veya pause gibi bir komut aldığını ancak komutun çalıştırılmasının henüz tamamlanmadığını belirten pending durumudur.

Windows servisleri, process space içinde çalıştırdıkları servis sayısına göre kategorilendirilirler. Bir process space içinde tek bir servis çalıştırabilir (Win32OwnProcess Services) veya birden çok servisin bir process space’i paylaşmasını (Win32ShareProcess Services) sağlayabiliriz.

Windows Uygulamaları ile Windows Servisleri Arasındaki Farklar
Windows servisleri, klasik windows uygulamalarına göre pek çok farklılık içermektedirler. 

Kurulum: Öncelikle windows servislerinin, bilgisayarda çalışabilmesi için öncelikle servis uygulaması olarak kayıt edilmesi gerekmektedir (windows servislerinin kurulumunu ilerleyen bölümlerde ele alıyor olacağız).
Debug: Yine debug konusunda da, klasik windows uygulamalarından farklı olarak F5 ve F11 tuşlarını kullanarak debug işlemini gerçekleştiremiyoruz.  Bir windows servisini debug edebilmemiz için öncelikle bilgisayara yükleyip çalıştırmamız, sonrasında bir debugger attach ederek çalışmamız gerekmektedir.

Çalıştırma: Windows servislerinde Run metodu servisi SCM’a yükler. Run metodunu servis uygulamasının Main metodundan çağırırız. Çalışma esnasındaki farklılıklardan bir diğeri de, windows servis uygulamalarının çalışması sırasında kullanıcıya hiç bir diyalog ekranı (hata bildirim, bilgilendirme, v.b amaçlı) görüntülenmez, mesajlar olay günlüğüne kayıt edilir. Windows servislerinin özel bir güvenlik contexti ile çalışmasını sağlayabiliriz. Bu nedenle windows servisleri, bir kullanıcı oturum açmadan veya oturumu kapattıktan sonra çalışabilir.

Windows Servis Uygulamalarının Programlama Modeli
Windows servis uygulamalarını, System.ServiceProcess alan adınının sunduğu sınıfları kullanarak geliştiririz. Tablo: 1.1, windows servislerinin oluşturulmasında, kurulum ve yönetimde kullanılan bazı sınıfları açıklamaktadır.

Tablo: 1.1 :: System.ServiceProcess Alan Adının Bazı Sınıfları

Sınıf

Açıklama

ServiceBase

Servis uygulamaları oluşturmak için kullanılan temel metodları içeren sınıf.

ServiceProcessInstaller
ve ServiceInstaller

Servis uygulamalarının bilgisayara kurulumunu ve kaldırılmasını sağlayan metodları sunan sınıflar.

ServiceController

Servis uygulamasının gerçekleştireceği işlemleri (başlama, durma, bekleme gibi) yönetmemizi sağlayan metodları sunan sınıf.

System.ServiceProcess alan adının sunduğu bu sınıflara ek olarak, windows uygulamalarının durumunu gözlemlemek ve uygulama çalışırken debug işlemleri yapabilmek için System.Diagnostics alan adının sağladığı bazı sınıfları da kullanırız. Tablo: 1.2 bu sınıflardan bazılarını listelemektedir.

Tablo: 1.2 :: System.Diagnostics Alan Adının Bazı Sınıfları

Sınıf

Açıklama

EventLog

Servis uygulamamızın olay günlüğüne kayıt ekleyebilmesi için kullanılan sınıf.

PerformanceCounter

Kaynak utilizasyonunu gözlemleyebilmemiz için performance counter’lar tanımlayabilmemizi sağlayan sınıf.

Trace ve Debug

Bu sınıfların sunduğu metodlar, debug yapabilmemizi ve uygulamanın işleyişini izleyebilmemizi sağlamaktadır.

Windows servisi oluşturmak için System.ServiceProcess.ServiceBase sınıfını extend eden bir sınıf oluştururuz. Tablo: 1.3 ServiceBase sınıfının sunduğu temel metodları listelemektedir.

Tablo: 1.3 :: ServiceBase Sınıfının Metodları

Metod

Açıklama

OnStart

Servis çalıştığı anda yapılacak işlemlerin tanımlandığı metod.

OnPause

Servisin beklemeye alınması durumunda yapılacak işlemlerin tanımlandığı metod.

OnStop

Servisin durduğu anda yapılacak işlemlerin tanımlandığı metod.

OnContinue

Servisin bekleme durumundayken yeniden çalıştırılması anında yapılacak işlemlerin tanımlandığı metod.

OnShutDown

Servisin çalıştığı bilgisayarın kapatılması durumunda yapılacak işlemlerin tanımlandığı metod.

OnCustomCommand

Servisin özel komutlar kabul etmesini istediğimiz durumlarda bu metodu kullanırız.

OnPowerEvent

Güç yönetimi ile ilgili bir olay gerçekleştiğinde (batarya zayıf v.b.) yapılacak işlemlerin tanımlandığı metod.

ServiceBase sınıfının sunduğu metodları override ederek windows servisini oluşturduktan sonra , ServiceProcessInstaller ve ServiceInstaller sınıflarını kullanarak servis uygulamamızın kurulumunu yapmamız gerekiyor. Önceden söylediğimiz gibi, her servis, kendi proses alanında çalışır. Bu nedenle servis uygulamasını bilgisayara yüklemeden önce, bir servis prosesinin oluşturulması ve yüklenmesi gerekiyor. ServiceProcessInstaller sınıfı, windows servisimizin yükleneceği ve çalıştırılacağı service process'i oluşturmakta kullanılırken, ServiceInstaller sınıfı, windows servisimizi oluşturulan service process'e yüklemekte kullanılır.

Servisimizi oluşturduktan ve bilgisayara yükledikten sonra, ServiceController sınıfını kullanarak servisimizi programatik olarak yönetebiliriz. Tablo: 1.4, ServiceController sınıfının, windows servislerinin yönetiminde kullanmamız için sunduğu temel metodları listelemektedir.

Tablo: 1.3 :: ServiceBase Sınıfının Metodları

Metod

Açıklama

Close

ServiceController sınıfının servisle arasındaki ağlantıyı keser ve kullanılan tüm kaynakları serbest bırakır.

Continue

Bekleme durumuna alınan servisin çalışmasına devam etmesini sağlar.

ExecuteCommand

Servise özel bir komut göndermemizi sağlar.

Pause

Servisi beklemeye alır.

Refresh

Tüm özelliklerin değerlerini yeniler.

Start

Servisi çalıştırır.

Stop

Servisi durdurur.

Bu bölümde windows servisleri ile ilgili temel konuları ele alarak windows servislerinin mimarisini ve window servisi programlama modelini inceledik. Bir sonraki bölümde bir windows servisi oluşturmayı ve varsayılan özelliklerini değiştirmeyi ele alıyor olacağız.

Kaynaklar:
. Microsoft Developers Network (http://msdn.microsoft.com)
. Technet (http://technet.microsoft.com/)
. Developing XML Web Services and Server Components with Microsoft Visual Basic .NET and Microsoft Visual C# .NET ()