systemd-cgls ile Süreç Hiyerarşisini Görüntüleme

Bir Linux sisteminde neler döndüğünü anlamak istediğinizde, ps aux veya top gibi araçlara uzanmak kaçınılmaz bir refleks haline gelir. Ama bu araçlar size süreçlerin düz bir listesini verir; aralarındaki ilişkiyi, kimin kimi başlattığını, hangi servisin hangi süreci kontrol ettiğini göremezsiniz. İşte tam bu noktada systemd-cgls devreye girer ve size süreç dünyasının gerçek yüzünü, yani hiyerarşik yapıyı gösterir.

systemd-cgls Nedir?

systemd-cgls, Linux’un cgroup (control group) hiyerarşisini ağaç yapısında görüntüleyen bir araçtır. systemd ekosisteminin bir parçası olan bu komut, hangi servisin hangi süreçleri kapsadığını, bu süreçlerin birbirleriyle nasıl ilişkilendiğini ve cgroup ağacının nasıl organize edildiğini tek bakışta anlamanızı sağlar.

Cgroup’lar, Linux çekirdeğinin süreçleri mantıksal gruplara ayırmasını ve bu gruplara kaynak limitleri, izleme ve kontrol mekanizmaları uygulamasını sağlayan bir özelliktir. systemd, her servis için ayrı bir cgroup oluşturur ve böylece o servise ait tüm süreçler tek bir çatı altında toplanır. systemd-cgls de bu çatıyı size görsel olarak sunar.

Kurulum gerekmez; systemd yüklü her modern Linux dağıtımında hazır olarak gelir. Ubuntu, Debian, Fedora, RHEL, Arch Linux fark etmez, systemd varsa systemd-cgls de vardır.

Temel Kullanım

Komutu parametresiz çalıştırdığınızda, tüm cgroup hiyerarşisini görürsünüz:

systemd-cgls

Çıktı şuna benzer bir görünüm alır:

Control group /:
-.slice
├─user.slice
│ └─user-1000.slice
│   ├─[email protected]
│   │ └─init.scope
│   │   ├─1842 /lib/systemd/systemd --user
│   │   └─1843 (sd-pam)
│   └─session-3.scope
│     ├─2156 sshd: ahmet [priv]
│     ├─2158 sshd: ahmet@pts/0
│     └─2159 -bash
├─system.slice
│ ├─nginx.service
│ │ ├─985 nginx: master process /usr/sbin/nginx
│ │ ├─986 nginx: worker process
│ │ └─987 nginx: worker process
│ ├─mysql.service
│ │ ├─1024 /usr/sbin/mysqld
│ │ └─1025 /usr/sbin/mysqld
│ └─sshd.service
│   └─984 sshd: /usr/sbin/sshd -D
└─init.scope
  └─1 /sbin/init

Bu çıktı size çok şey söyler. system.slice altında tüm sistem servislerini görürsünüz. user.slice altında kullanıcı oturumlarını ve o oturumlarda çalışan süreçleri görürsünüz. Her servisin kaç süreç çalıştırdığı, bu süreçlerin PID numaraları ve komut satırları tek bakışta görünür.

Önemli Parametreler ve Seçenekler

-l veya --full: Süreç isimlerini kısaltmadan tam olarak gösterir. Normalde uzun komut satırları terminal genişliğine göre kırpılır, bu seçenek bunu engeller.

systemd-cgls -l

--no-pager: Çıktıyı sayfalayıcı (less/more) olmadan direkt terminale basar. Script’lerde veya pipe işlemlerinde kullanışlıdır.

systemd-cgls --no-pager

-k veya --kernel-threads: Normalde gizlenen çekirdek thread’lerini de gösterir. Sistem performans sorunlarını araştırırken faydalıdır.

systemd-cgls -k

Belirli bir cgroup yolu: Sadece ilgilendiğiniz bir cgroup’u görüntüleyebilirsiniz.

systemd-cgls /system.slice/nginx.service

Birden fazla cgroup: Birden fazla cgroup’u aynı anda görüntüleyebilirsiniz.

systemd-cgls /system.slice/nginx.service /system.slice/mysql.service

--version: Komutun sürümünü gösterir.

systemd-cgls --version

Belirli Servisleri İnceleme

Tüm sisteme bakmak yerine sadece ilgilendiğiniz servise odaklanmak çok daha pratiktir. Örneğin bir web sunucusunun süreç yapısına bakmak istiyorsunuz:

systemd-cgls /system.slice/apache2.service

Ya da daha kısa yoldan servis adını doğrudan yazabilirsiniz:

systemd-cgls apache2.service

Bu komut size sadece Apache’ye ait süreçleri gösterir. Özellikle bir servis beklenmedik sayıda süreç üretiyorsa veya zombie süreçler oluşturuyorsa bu görünüm son derece değerlidir.

Docker kullanan bir sistemde container süreçlerinin nasıl organize edildiğini görmek için:

systemd-cgls /system.slice/docker.service

Bu komutun çıktısı, Docker daemon’ının altında hangi container süreçlerinin çalıştığını ve her birinin nasıl izole edildiğini gösterir.

Gerçek Dünya Senaryosu 1: Kaçak Süreç Tespiti

Diyelim ki sunucunuzun CPU kullanımı aniden yükseldi. top ile baktığınızda yüksek CPU kullanan birkaç süreç görüyorsunuz ama bunların hangi servise ait olduğunu bilmiyorsunuz. İşte systemd-cgls burada inanılmaz bir kolaylık sağlar:

systemd-cgls --no-pager | grep -A 5 "high-cpu-process-name"

Ya da doğrudan tüm hiyerarşiyi bir dosyaya kaydedip inceleyebilirsiniz:

systemd-cgls --no-pager -l > /tmp/cgroup-snapshot.txt
cat /tmp/cgroup-snapshot.txt | grep -B 10 "şüpheli-süreç"

Bu yöntemle şüpheli süreci bulduğunuzda, onun hangi servisin altında çalıştığını ve dolayısıyla problemi nerede aramanız gerektiğini hemen anlarsınız.

Gerçek Dünya Senaryosu 2: Web Sunucusu Worker Yönetimi

Nginx veya Apache gibi web sunucuları, ana süreç (master) ve birden fazla worker süreç mimarisiyle çalışır. Prodüksiyonda bir web sunucusunu yeniden yapılandırdıktan sonra worker sayısının doğru ayarlanıp ayarlanmadığını kontrol etmek için:

systemd-cgls /system.slice/nginx.service
Control group /system.slice/nginx.service:
└─nginx.service
  ├─ 985 nginx: master process /usr/sbin/nginx -g daemon off;
  ├─1120 nginx: worker process
  ├─1121 nginx: worker process
  ├─1122 nginx: worker process
  ├─1123 nginx: worker process
  └─1124 nginx: cache manager process

Bu çıktıdan 4 worker process ve 1 cache manager process çalıştığını anlıyorsunuz. nginx.conf dosyanızda worker_processes 4 yazdıysanız yapılandırma doğru uygulanmış demektir.

Benzer şekilde PostgreSQL veya MySQL gibi veritabanı sunucularında da bağlantı pool’larını ve arka plan worker’larını bu şekilde görselleştirebilirsiniz:

systemd-cgls /system.slice/postgresql.service

Gerçek Dünya Senaryosu 3: Kullanıcı Oturumu Analizi

Çok kullanıcılı bir sistemde kim nerede ne yapıyor diye merak ediyorsanız, user.slice’a bakmanız yeterli:

systemd-cgls /user.slice

Bu komut size tüm aktif kullanıcı oturumlarını ve bu oturumlarda çalışan süreçleri gösterir. Hangi kullanıcının kaç süreç çalıştırdığını, hangi uygulamaları açtığını tek seferde görebilirsiniz. Bu özellikle shared hosting veya çok kiracılı (multi-tenant) sistemlerde çok faydalıdır.

Belirli bir kullanıcının oturumuna bakmak için kullanıcı ID’sini kullanabilirsiniz. UID 1001 olan kullanıcı için:

systemd-cgls /user.slice/user-1001.slice

cgroup v1 ve cgroup v2 Farkı

Modern Linux sistemlerinin büyük çoğunluğu artık cgroup v2 kullanıyor. systemd-cgls her ikisiyle de çalışır ama çıktı yapısı biraz farklılık gösterebilir.

cgroup v2 kullanıp kullanmadığınızı kontrol etmek için:

mount | grep cgroup

Veya:

ls /sys/fs/cgroup/

cgroup v2’de her şey tek bir birleşik hiyerarşide toplanır; v1’deki gibi cpu, memory, blkio gibi ayrı alt sistemler yoktur. Bu systemd-cgls çıktısını aslında daha temiz ve anlaşılır hale getirir.

systemd-cgls vs Diğer Araçlar

systemd-cgls‘i benzer araçlarla karşılaştırdığınızda her birinin farklı bir amaca hizmet ettiğini görürsünüz.

ps aux ile farkı: ps aux size süreçlerin düz bir listesini verir; hangi servisin hangi süreci yönettiğini göremezsiniz. systemd-cgls ise cgroup hiyerarşisini gösterdiği için servis-süreç ilişkisi çok nettir.

pstree ile farkı: pstree ebeveyn-çocuk ilişkisine dayalı süreç ağacını gösterir. Bu yararlıdır ama cgroup organizasyonunu göstermez. Bir süreç fork ederek başka bir servise “kaçabilir” ve pstree bunu yanlış kategoride gösterebilir. systemd-cgls cgroup’a göre gruplandırdığı için bu yanılmaz.

systemd-cgtop ile farkı: systemd-cgtop gerçek zamanlı kaynak kullanımını (CPU, bellek, I/O) cgroup bazında gösterir. systemd-cgls ise statik bir anlık görüntü verir ama süreç detayları çok daha fazladır. İkisi birbirini tamamlar.

# Anlık hiyerarşi icin
systemd-cgls

# Gercek zamanli kaynak izleme icin
systemd-cgtop

Scripting ve Otomasyon

systemd-cgls çıktısını script’lerinizde kullanmak istediğinizde --no-pager ve -l seçeneklerini kombine etmeniz gerekir:

#!/bin/bash
# Belirli bir servisin surec sayisini kontrol et

SERVICE_NAME="nginx.service"
PROCESS_COUNT=$(systemd-cgls --no-pager -l /system.slice/$SERVICE_NAME 2>/dev/null | grep -c "nginx: worker")

echo "Nginx worker surec sayisi: $PROCESS_COUNT"

if [ "$PROCESS_COUNT" -lt 2 ]; then
    echo "UYARI: Beklenen worker sayisinin altinda!"
    # Bildirim gonder veya servisi yeniden baslat
    systemctl restart nginx
fi

Bu tür script’ler monitoring altyapınızın bir parçası olabilir. Cron job olarak çalıştırarak periyodik kontroller yapabilirsiniz.

Bir başka kullanım senaryosu, sistemin anlık durumunu düzenli aralıklarla kaydetmek ve karşılaştırmaktır:

#!/bin/bash
# Sistem surec anlık goruntusunu kaydet

TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_DIR="/var/log/cgroup-snapshots"

mkdir -p $LOG_DIR

systemd-cgls --no-pager -l > "$LOG_DIR/snapshot_$TIMESTAMP.txt"

# 7 gunden eski dosyalari sil
find $LOG_DIR -name "snapshot_*.txt" -mtime +7 -delete

echo "Snapshot kaydedildi: $LOG_DIR/snapshot_$TIMESTAMP.txt"

Cgroup Bilgilerini /sys/fs/cgroup ile Birleştirme

systemd-cgls çıktısını gördükten sonra daha derine inmek isterseniz, /sys/fs/cgroup dosya sistemi üzerinden ham cgroup verilerine ulaşabilirsiniz:

# Once cgls ile servisi bul
systemd-cgls /system.slice/nginx.service

# Sonra o servisin cgroup bilgilerine bak
cat /sys/fs/cgroup/system.slice/nginx.service/cgroup.procs

Bu komut o cgroup’a ait tüm PID’leri listeler. Ardından bu PID’leri kullanarak daha fazla bilgi toplayabilirsiniz:

# Her PID icin detayli bilgi al
for pid in $(cat /sys/fs/cgroup/system.slice/nginx.service/cgroup.procs); do
    echo "PID: $pid - $(cat /proc/$pid/cmdline | tr '' ' ')"
done

Güvenlik Denetimi Açısından Kullanım

Sistem güvenliği açısından systemd-cgls değerli bir araçtır. Özellikle şüpheli aktivite araştırırken:

# Tum sistemi tara ve beklenmedik surecleri ara
systemd-cgls --no-pager -l | grep -v -E "(systemd|kernel|kthread)" | less

Eğer bir servis altında beklenmedik isimde bir süreç görüyorsanız bu ciddi bir uyarı işareti olabilir. Örneğin apache2.service altında nc (netcat) veya bash gibi bir süreç görüyorsanız, muhtemelen bir web shell saldırısına uğramışsınızdır.

# Şüpheli surecleri kontrol et
systemd-cgls --no-pager -l /system.slice/apache2.service | grep -E "(bash|sh|nc|python|perl|wget|curl)"

Bu tür kontrolleri IDS (Intrusion Detection System) sisteminizin bir parçası haline getirebilirsiniz.

Slice’ları Anlamak

systemd-cgls çıktısında sık sık .slice uzantılı birimler görürsünüz. Bunlar cgroup ağacının düğümleridir:

-.slice: Kök slice, tüm hiyerarşinin tepesinde bulunur.

system.slice: Sistem servislerini (daemon’ları) içerir. systemctl start ile başlatılan servisler buraya girer.

user.slice: Kullanıcı oturumlarını içerir. Her kullanıcı için ayrı bir alt slice oluşturulur.

machine.slice: Sanal makineler ve container’ları içerir. libvirt veya nspawn ile başlatılan VM’ler buraya düşer.

init.scope: PID 1 (init/systemd) kendisi burada yaşar.

Özel slice’lar oluşturmak da mümkündür. Örneğin yüksek öncelikli servislerinizi ayrı bir slice’a koyarak kaynak yönetimini daha iyi kontrol edebilirsiniz. systemd-cgls bu özel slice’ları da gösterir:

# Ozel bir slice olustur
sudo systemctl start myapp.slice

# cgls ile kontrol et
systemd-cgls /myapp.slice

Sık Karşılaşılan Durumlar ve Çözümler

Bazen systemd-cgls çalıştırdığınızda bazı servisler altında (empty) yazısını görürsünüz. Bu, o servisin cgroup’unun mevcut olduğunu ama aktif süreç içermediğini gösterir. Bu durum genellikle bir servis başlatılıp hemen kapandığında veya oneshot tipi servislerde görülür.

Bazen de /proc dosyası hızla değiştiği için anlık görüntüde tutarsızlıklar olabilir. Kritik bir analiz yapıyorsanız birkaç saniye arayla iki defa çalıştırıp çıktıları karşılaştırın:

systemd-cgls --no-pager > /tmp/snap1.txt
sleep 3
systemd-cgls --no-pager > /tmp/snap2.txt
diff /tmp/snap1.txt /tmp/snap2.txt

diff çıktısındaki değişiklikler size sistemde o 3 saniyede neler değiştiğini gösterir. Hızla gelen ve giden süreçler, spawn storm’ları veya restart döngüleri bu şekilde yakalanabilir.

Pratik İpuçları

Günlük kullanımda systemd-cgls‘i daha verimli kullanmak için birkaç ipucu:

Çıktı çok uzun olduğunda grep ile filtrelemek yerine, doğrudan ilgilendiğiniz cgroup yolunu argüman olarak vermek daha temiz sonuç verir. Bu hem daha hızlıdır hem de ilgisiz bilgilerle kafanızı karıştırmaz.

Terminalde renk desteği varsa çıktı zaten renkli gelir. Ama SSH üzerinden bağlıyken renk kaybolabilir. Bu durumda TERM=xterm-256color systemd-cgls şeklinde çalıştırmayı deneyebilirsiniz.

Alias tanımlamak da işleri hızlandırır:

# ~/.bashrc veya ~/.bash_aliases dosyasina ekleyin
alias cgls='systemd-cgls --no-pager -l'
alias cgsys='systemd-cgls /system.slice'
alias cguser='systemd-cgls /user.slice'

Sonuç

systemd-cgls, modern Linux sistem yönetiminin vazgeçilmez araçlarından biridir. Süreçlerin düz bir listesini görmek yerine, onların cgroup hiyerarşisi içindeki yerini ve birbirleriyle ilişkilerini görmek; sorun giderme sürecini dramatik biçimde hızlandırır ve sistemi anlamayı kolaylaştırır.

Kaçak süreç aramaktan güvenlik denetimine, worker sayısı kontrolünden kullanıcı oturumu analizine kadar pek çok senaryoda bu aracı kullanabilirsiniz. ps aux ve top gibi araçların yanında cephaneliğinizde mutlaka bulunması gereken systemd-cgls‘i, özellikle karmaşık servis mimarilerini yönettiğinizde ve Docker/Kubernetes gibi container teknolojileriyle çalıştığınızda çok daha fazla değerli bulacaksınız.

Şimdi terminalinizi açın ve systemd-cgls yazın. Sisteminizin size anlatacağı hikayeyi dinleyin.

Yorum yapın