UGM İnovasyon Departmanı - Göker Kumdakcı Linux Servisi Oluşturmak Ön Bilgi Bu rehber, Linux servisi oluşturmak ve kendi kendine çalışır hale getirmek konularında bilgi içeriyor. Çeşitli kütüphaneleri kullanması gereken Python ile yazılmış bir kodun Linux servisi olarak çalışmasını ve bilgisayarın açılması halinde kendi kendine başlamasını sağlayacağız. Rehber herhangi bir dil ile yazılmış kodlar için de kullanılabilir. Daha fazla açıklama için, en altta yer alan “Kavramlar ve Rehber Hakkında” bölümüne bakabilirsiniz. Kullanılan versiyonlar: ● Python 3.7.5 ● Ubuntu Linux 19.10 ● virtualenv 15.1.0 [Python Sanal Ortam kütüphanesi] 18.1 [Sanal Ortam pip versiyonu] ● pip [Sanal Ortam Python versiyonu] Virtual Environment Oluşturmak [Linux / Windows] Öncelikle, python üzerinde yazmış olduğumuz kodun çeşitli kütüphanelere ihtiyaç duyduğunu varsayalım. Karmaşaya yol açmaması adına virtual environment kullanarak kodun sanal bir ortamda çalışmasını sağlayalım. Linux sistemimizde Python da virtual environment oluşturmak için; *Eğer pip yüklü değil ise ilk olarak onu yüklüyoruz Linux python3 -m pip install --user --upgrade pip Windows py -m pip install --upgrade pip *Virtual Environment ide pip ile yüklüyoruz Linux python3 -m pip install --user virtualenv Windows py -m pip install --user virtualenv *Oluşturma işlemini de gerçekleştiriyoruz. Bu işlem sırasında hangi dizinde bulunuyor isek sanal ortamımız o dizine oluşacaktır. Daha sonrası için bu dizini bilmemiz gerekiyor. Linux python3 -m venv env Windows py -m venv env *Sanal ortamımızı çalışır hale getiriyoruz. “env” bizim sanal ortamımızın bulunduğu klasör oluyor. Linux source env/bin/activate Windows .\env\Scripts\activate *Eğer kapatmak isterseniz terminale “ deactivate ” komutunu yazın. DURUM: Bu noktada, sanal ortamımızı hazır hale getirdik, çalıştırdık ve artık Python kodumuzu sanal ortamımızda çalıştırmaya hazırız. Python kodumuzu terminal üzerinden sanal ortamda çalıştırıp eğer bir hata alıyor isek düzeltmemiz gerekiyor. Oluşturduğumuz sanal ortamda hiçbir kütüphane yer almadığından hata almamız olası. Gerekli kütüphaneleri sanal ortamımız çalışır durumdayken yeniden kurmanız gerekmekte. pip aracılığı ile gerekli kütüphaneleri kurun. Rehberin devamında Python kodunuzun sanal ortamda sorunsuz bir biçimde çalışması gerekmekte. Rehberin devamında servise dönüştürmek istediğimiz Python programının isminin program.py olduğunu varsayıyorum. **Python dışında herhangi bir konsol uygulaması ile de rehbere devam edilebilir. Servisi Başlatması İçin Shell Script Oluşturmak Shell script(.sh) kullanarak, temelde terminal komutlarını çalıştıracağız ve Python programımızın başlatılmasını sağlayacağız. Servis olarak sisteme tanımlanması ve servisin başlatıldığı sırada çalışması amacı ile shell script formatında bir dosya hazırlamamız gerekiyor. Önemli: Örnek olması açısından ismini deneme_basla.sh olarak belirledim. Bu dosyanın yeri önemli değil, ancak bulunduğu tam dizin daha sonraki adımlarda kullanılacak. *Shell script dosyasının içerisine sanki terminale yeni girmiş ve yazmış olduğumuz programımızı terminal üzerinden çalıştırıyormuş gibi komutlar yazıyoruz. Önemli: Linux servisi başlatıldığı takdirde yazdığımız deneme_baslat.sh çalışacak. Daha sonradan bilgisayarın açıldığında otomatik olarak başlatılmasını da sağlayacağız. “ <shell scriptin bulunduğu dizin>/deneme_basla.sh” dosyası 1 2 3 4 5 6 #!/bin/bash source <Sanal ortamın bulunduğu dizin>/env/bin/activate python <Python kodunun bulunduğu dizin>/program.py *(3. satır) Sanal ortamı daha önceden terminal üzerinde çalışır hale getirdiğimiz komutu tekrar yazıyoruz. Önemli: Tam dizini yazmamız gerekiyor, yoksa dizin uyuşmazlığı hatası alabiliriz. *(5. satır) Terminal üzerinden Python programını çalıştıran komutu program.py dosyasının bulunduğu tam dizin ile beraber yazıyoruz. Not: Python programlarını çalıştırırken “python” komutu ile çalıştıramıyorsanız Python’un yüklü olduğu tam dizini yazın. Büyük ihtimalle bilgisayarınızın “PATH” larına Python ekli değildir. DURUM: deneme_basla.sh dosyasını oluşturup hazır hale getirdik. Şimdi bu dosyayı sisteme Linux Servis olarak tanımlamaya hazırız. **Oluşturduğumuz shell scripti istediğiniz gibi doldurarak kendi Linux servisinize özgü hale getirebilirsiniz. Ancak tam dizinleri yazmaya dikkat edin! Servis Dosyasının Sisteme Tanımlamak Linux üzerinde /lib/systemd/system/ klasörüne .service uzantısına sahip kendi servisimizi tanımlamamız gerekiyor. Varsayalım ki deneme adında bir Linux servisi oluşturmak istiyoruz. 1. /lib/systemd/system/ dizinine terminal üzerinden gidiyoruz. cd /lib/systemd/system/ 2. deneme.service isminde bir dosya oluşturuyoruz. 2.1. *Yetkilendirme gerekçesi nedeniyle “sudo” komutu ile çalıştırıp admin şifresini girmek gerekebilir. 2.2. *Ubuntu üzerinde nano ile açmayı tercih ettim, ancak herhangi bir başka text editörünü de kullanabilirsiniz(örneğin “vi”). Dizinden ulaşarak düzenleme yapamıyorsanız “chmod” komutunu ile kullandığınız kullanıcıya yetki atayın. sudo nano /lib/systemd/system/deneme.service 3. deneme.service dosyasının içerisine aşağıdaki örnek formata benzer biçimde gereken ve istediğimiz bilgileri dolduruyoruz. Önemli: Olabildiğince türkçe karakter kullanmayın. “/lib/systemd/system/deneme.service” dosyası 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 3.1. [Unit] Description=DenemeServisi [Service] Type=simple ExecStart=<shell scriptin bulunduğu dizin>/deneme_basla.sh [Install] WantedBy=multi-user.target Daha önceden oluşturduğumuz deneme_basla.sh dosyasının tam dizinini yukarıda oluşturduğumuz deneme.service dosyasına [Service] nin altında ExecStart değişkeninin karşısına yazmak gerekiyor. 3.2. Linux servisimize, [Unit] in altında Description değişkenine yazıyoruz. Bu kısım servisin sistemde gözüken ismi olacak. Örnek olarak “DenemeServisi” seçiyorum. 3.3. Geri kalan satırları aynı yukarıdaki gibi tanımlayarak devam edebiliriz. Not: Servis dosyalarının birçok ayarı bulunmakta, ancak bu kadarı devam edebilmemiz için yeterli. DURUM: /lib/systemd/system/ konumuna yerleştirdiğimiz deneme.service dosyamızın bilgilerini girerek, hazır hale getirdik. 4. Hazırladığımız servisin çalışır hale gelebilmesi için, linux servisinin yeniden başlatılması gerekiyor. sudo systemctl daemon-reload **Linux servisimiz bu noktada çalışmaya hazır. 5. Servisimizin bilgisayar başlatıldığında kendi kendine başlamasını sağlamak için aşağıdaki komutu terminalde çalıştırıyoruz. sudo systemctl enable deneme.service Not: Başlangıçta çalışmaya başlamasını iptal etmek isterseniz aşağıdaki komutu çalıştırın. sudo systemctl disable deneme.service Python programımız Linux servisi olarak çalışır hale geldi. Bilgisayarın açılışında otomatik olarak çalışacak. “Ek komutlar” bölümünde isteğe bağlı olarak çeşitli kontrolleri yapabilmeniz için gereken komutlar bulunmakta. Ek komutlar *Servisin anlık durumunu kontrol etmek için; sudo systemctl status deneme.service *Servisi başlatmak için; sudo systemctl start deneme.service *Servisi durdurmak için; sudo systemctl stop deneme.service *Servisin başlangıçta otomatik çalışması ayarlarını görüntülemek için; sudo systemctl list-unit-files Not: Karşınıza gelen tabloda .service uzantılı dosyanın ismini ve başlangıçta açılış ayarlarını görebilirsiniz. Bizim rehberimiz için, deneme.service dosyamız “UNIT FILE” sütununun altında olacaktır ve “STATE” sütununun altında da “enabled” yazacaktır(başlangıçta çalışma açık). *Servisin diğer ayarlarını görüntülemek için; sudo systemctl list-units Not: Buradaki tabloda var olan servislere dair birçok bilgi yer almakta. Örnek olarak deneme.service “UNIT” sütununun altında olacaktır ve “LOAD” sütunun altında loaded yazacaktır(sisteme tanımlandığı anlamına gelmekte). “ACTIVE” sütunu servisin çalışıp çalışmadığını belirtir(bizim servisimizde “active” yazacaktır). “SUB” sütununda servisin durumu yazar, “exited” çalışmış ve tamamlanmış anlamına gelir. Bu sütunda “running” yazıyor ise hala çalışmaktadır. “DESCRIPTION” sütununda servisin ismi yada kısa açıklaması yazar. Bu alan deneme.service dosyasının içerisine yazdığımız “Description” değişkenine karşılık geliyor(bizim servisimizde “DenemeServisi” yazar). Kavramlar ve Rehber Hakkında Python programının serverlarda yeniden başlatılsa da her zaman çalışmasını sağlamak için Linux servisi oluşturmamız gerekir. Bu ihtiyacın sonucunda ise rehber ortaya çıktı. Rehber bir takım kavramların önceden bildiğini varsayıyor. Aşağıda bu kavramların rehber ile alakalı olan kısımları hakkında kısa açıklamalar yer almakta. Terminal: Herhangi bir program aracılık etmeksizin bilgisayar üzerinde işlemler yapabilmemize olanak sağlayan arayüz. Sistem ile doğrudan iletişime geçebiliriz. Rehberin bir kısmını terminal üzerinden takip etmek zorunda değilsiniz, ancak sistem komutlarını çalıştırabilmek için terminali kullanmamız gerekiyor. Komut: Terminal üzerinden işletim sisteminin ne yapacağını anlatan eylem bilgisi. Örneğin terminalin işlem yapacağı dizini değiştirmek için “cd Desktop/Klasörüm” yazıyoruz. “cd” sisteme işlem yapılan dizini değiştireceğimizi söylüyor, “Desktop/Klasörüm” de yeni dizinin neresi olacağını belirtiyor. Bu komut çalıştığında ise terminal işlem yaptığı dizini değiştiriyor. Shell Script: Terminal komutlarının arka arkaya yazıldığı ve çalıştırıldığı bir dosya tipi. Biz rehberde, sanal ortamımızın başlatılmasısı ve Python programımızın bu sanal ortamda çalıştırılmasını sağlayan komutları sell script formatında yazıyoruz. Servisi bu shell script dosyasını çalıştırmak için kullandık. Virtual Environment(Sanal Ortam): Sistem içerisinde sistem gibi çalışan ve çalıştırılan programların farklı ortamlar kullanarak çakışmalarına mani olan yapıdır. Ayrı ayrı sanal ortamlarda çalıştırılan kodlar farklı kütüphaneleri ve aynı kütüphanelerin farklı sürümlerini kullanabilir. Kütüphaneler sanal ortamlar sayesinde birbirine karışmazlar. Python programını servera yükleyeceğim için kendi sanal ortamını oluşturdum. Dolayısıyla, server üzerinde aynı kütüphanenin farklı sürümünü kullanan programlar var ise herhangi bir sorun yaşamaksızın işlemlerine devam edebilirler. pip: Python için kütüphane indirme ve organize etme aracı. Programımıza gerekli kütüphanelerin hızlı ve kolay bir biçimde sanal ortamımıza kurmak için kullandık. Linux Servis: Çeşitli işlemleri gerçekleştirmesi amacı ile sistem bünyesinde bulunan komutlar. Linux servislerinin her zaman açık kalması sağlanabildiğinden kodumuzu servise çevirdik. Bu sayede server üzerinde hep aktif halde olabilir.