Linux sistem başlangıcında program, kod veya script çalıştırmak aslında Windows ortamında aynı işlemi yapmaktan çok daha basittir. Ubuntu, Centos, Debian hatta Arc Linux bile artık aynı sistem başlangıç yöneticisi olan systemd
altyapısını kullanıyor.
Systemd nedir, Systemd ile başlangıç yönetimi nasıl yapılır?
Systemd yeni Linux dağıtımlarının çoğunda kullanılan servis yönetim sistemidir. Sistem başlangıcına program ve script yerleştirmekten tutun bunların servis olarak ele alınıp hata durumunda ne yapılacağı, bunların kayıtlarının nerede tutulacağı gibi bir çok ayarı doğrudan yapmamızı sağlar.
Systemd ilk çıktığında init, upstart gibi başlangıç yönetim sistemlerine göre çok daha kapsamlı olduğu ve sistemin bir çok noktasına müdahale ettiği için tepki gördü. İlk başlangıç sistemi yöneticisi olan init yani SysV bu işi basit bash scriptleri ile yapıyordu. Upstart bunu bir adım daha öteye götürerek ayar dosyalarının önünü açtı. Systemd ile ise artık birbirine bağlı hizmetler ve farklı unit birimleri oluşturulabiliyor.
SystemD ile başlangıçta program çalıştırma örneği
Kullanıcı yani bizim tarafından yazılması gereken systemd ayar dosyaları /etc/systemd/system dizinine kaydedilir. Bu dizine baktığınızda bir kaç ayar dosyası dışında neredeyse boş olduğunu göreceksiniz. Bu sayede systemd yapılandırması oldukça kolay oluyor, bir sistemde çalışan kullanıcı tarafından eklenmiş her servisi ve unit’i burada görebilirsiniz.
Şimdi kendi denemescript servisimizi oluşturalım:
nano /etc/system/systemd/denemescript.service
[Unit]
Description=denemescript
Requires=local-fs.target network-online.target
After=local-fs.target network-online.target
[Service]
Environment=envdegisken1=deger1
Environment=envdegisken2=deger2
Environment=envdegisken3=deger3
User=root
Group=root
Type=simple
ExecStart=/root/denemescript.sh
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Bırada /root/denemescript.sh
adresindeki scripti root kullanıcısı ve grubuyla çalıştıracak bir servis tanımladık. Yalnız bunun otomatik olarak sistem başlangıcına yerleşmeyeceğini unutmayalım. Başlangıçta script çalıştırmak için alttaki komutu da çalıştırıp servisi aktif hale getirmek gerekiyor:
systemctl enable denemescript.service
Bender şekilde disable
komutu ile servisi başlangıçta çalışmasını devre dışı bırakabiliriz ve start
stop
komutlarıyla manuel olarak başlatıp durdurabiliriz.
systemctl start denemescript.service
systemctl stop denemescript.service
Systemd ile servis loglarına ulaşma
Bu servisin loglarına ise journalctl
üzerinden ulaşıyoruz.
journalctl -u denemescript
journalctl -u denemescript -f
komutları ile detaylı şekilde systemd servislerine ait log dosyalarını görüntüleyebilir ve takip edebiliriz. systemctl status denemescript
ile ise log dosyalarının son satırlarını ve sistemin şu anki durumunu görüntüleyebiliyoruz.
Tüm systemd servislerini listeleme
Özel bir systemctl
parametresi ile şuan çalışmakta olan tüm systemd servislerini listelemek de mümkündür:
systemctl list-units --type service --state running
Upstart ile sistem açılışında program komut ve script çalıştırma
Ubuntu 16 sürümünden önce Systemd yerine System V init ve Upstart destekleniyordu. Özellikle Ubuntu 14.04’ün günümüzde hala aktif olarak kullanıldığını düşünürsek upstart ile ilgili de bir kaç örnek vermek yararlı olur diye düşündüm.
Upstart nedir, ne işe yarar ve nasıl kullanılır
Upstart Ubuntu’nun yapıncısı Conanical tarafından geliştirilen bir başlangıç yönetim sistemidir. Ubuntu dışında Google ChromeOS’ta da kullanıldı. Debian, Fedora gibi dağıtımlar başta Upstart’ı destekleseler de sonradan SystemD kullanmaya karar verdiler. Kısacası upstart systemD öncesi dönemde kullanılan bir sistem başlangıç yöneticisidir
Upstart ile başlangıçta script çalıştırma örneği
Upstart ayar dosyaları /etc/init
dizininde tutulur. SystemV script dosyalarının /etc/init.d
de tutulduğunu düşünürsek doğrudan bir alternatif olarak tasarlandığını görebiliriz. Örnek bir başlangıç script olarka ornekservis isimli bir upstart servisi oluşturalım.
nano /etc/init/ornekservis.conf
Komutu ile gerekli ayar dosyamızı oluşturup alttaki ayarları girelim:
description "ornekservis"
env ortamdegiskeni1=deger1
env ortamdegiskeni2=deger2
start on runlevel [2345]
stop on runlevel [!2345]
respawn
post-stop exec sleep 5
limit nofile 65000 65000
setuid root
setgid root
chdir /root/ornekservis
exec /usr/bin/python ornekservis.py
Bu şekilde /root/ornekservis
dizinindeki ornekservis.py
dosyasını python kullanarak sistem başlangıcına yerleştirmiş olduk. Bu servisi systemd olduğu gibi başlangıca yerleştirmek için enable
gibi bir komuta ihtiyacımız yok. Sistem başlangıcında otomatik olarak bu haliyle çalışacaktır.
runlevel [2345]
ifadesi servisin ne zaman çalışacağını belirtiyor. 2345 rakamları multi-user yani çoklu kullanıcı ortamının aktif olduğu zamanı belirtiyor. Böylece sistem hazır olana kadar çalışma ertelenmiş oluyor.
Upstart Servis Logları ve Kayıt Dosyaları
Upstart servislerinin çıktıları doğrudan dosyaya yazılıyor. Bu dosyalar varsayılan olarak /var/log/upstart/
dizinine kaydediliyor ve tail
gibi temel sistem araçları ile gerçek zamanlı takip edilebiliyorlar. Yukarıdaki örnek servisimizi takip etmek için:
tail -f /var/log/upstart/redis-server.log
Komutunu kullanıyoruz. Şu an açık olan tüm servislerin log dosyalarını listelemek istersek lsof
komutunu kullanabiliriz:
lsof +D /var/log/upstart/
Servisleri durdurup başlatmak ve durumların görüntülemek için alttaki service
komutlarını kullanıyoruz:
service ornekservis start
service ornekservis status
service ornekservis stop
Çalışan servisleri listelemek için initctl komutunu şu şekilde kullanıyoruz:
initctl list | grep running