Uploaded by Nurgül Aykaş

Göker Kumdakcı - Linux servisi Oluşturma Rehberi

advertisement
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.
Download