Linux'ta Go Kullanarak Binary İsimi ile PID'lerin Etkin Bir Şekilde Bulunması

Birçok sistem işlevi için, Go uygulaması üzerinden execute edilen process’leri yönetmek ve bunların İşlem Kimliklerini (PIDs) bulmak önemlidir. Ancak, özellikle isimler uzunsa veya (işlem durumu) ps gibi araçları kullanırken doğru şekilde görüntelenemediğinde PID’leri almak zor olabilmektedir.

Sorun: Binary İsimleri Kullanarak Process’leri Bulabilmek

Linux sisteminde heterojen bir process grubuyla çalışırken, process’lerin binary isimleri kullanarak tanımlayabilmek önemlidir. Linux sistemleri, process adını belli bir genişlikteki bir process listeleme alanına sığdırmak için otomatik olarak kısaltır. Birçok sistem yardımcı programı, ps, top ve htop gibi, process adını sıklıkla kısaltır. Bu araçlar, sıkça process adını kısaltarak komut satırı girişlerini process adının genişliği kadar kısaltırlar.

Çözüm: Process ID’leri (PID) Almak İçin Fonksiyon Oluşturma

Aşağıda yer alan Go fonksiyonu ile, binary isimlerine göre process’leri çok daha kolay bir şekilde bulabiliriz. Linux filesystem üzerinde /proc dizininde process adı ile birlikte PID’leri symbolic link olarak tutar. Aşağıdaki fonksiyon, bu symbolic linkleri okuyarak binary isimlerine göre process’leri bulabiliriz.

 1const (
 2	procPath = "/proc"
 3	exePath  = "exe"
 4)
 5
 6func findPID(binaryName string) ([]int, error) {
 7	processIDs := make([]int, 0)
 8
 9	procs, err := os.ReadDir(procPath)
10	if err != nil {
11		return nil, err
12	}
13
14	for _, proc := range procs {
15		pid, err := strconv.Atoi(proc.Name())
16		if err != nil {
17			continue
18		}
19
20		binPath := filepath.Join(procPath, proc.Name(), exePath)
21
22		link, err := os.Readlink(binPath)
23		if err != nil {
24			continue
25		}
26
27		fileName := filepath.Base(link)
28
29		if strings.EqualFold(fileName, binaryName) {
30			processIDs = append(processIDs, pid)
31		}
32	}
33
34	return processIDs, nil
35}
  1. /proc Dizinini Okuma: Fonksiyon, etkin process’ler, temsil eden dizinlerin bir listesini elde etmek için /proc dosya sistemini okuyarak başlar. Fonksiyon, /proc dosya sistemindeki dizinlerin listesini okur ve her bir process’i temsil eden dizin üzerinden iterasyon yapar. /proc/<PID>/exe binary dosya yolunu ve os.Readlink kullanarak sembolik bağı okur. Daha sonra, sembolik bağdan elde edilen dosya adını istenilen binaryName ile büyük harf küçük harf duyarlılıklı karşılaştırıyoruz.
  2. İterasyon ve Eşleştirme: Her dizin üzerinden geçerek PID’yi ve process’in binary dosya yolunu elde ediyoruz.
  3. Binary İsimleri Karşılaştırma: Binary dosya yolunun sembolik bağını okuyarak ve dosya adını çıkararak, binary ismi istenen isimle büyük küçük harf duyarlılığıyla karşılaştırıyoruz.
  4. Sonucu Oluşturma: Eşleşme bulunduğunda, fonksiyon ilgili PID’yi PID listesine ekliyoruz.(Birden fazla aynı isimde process olabilir.)

Uygulama Yaklaşım Faydaları

  • Process ID’lerin Kesin Tanımlanması: Process’lerin binary isimlerine doğru şekilde eşlenmesini sağlayarak standart araçların kısıtlamalarını aşar.
  • Process İzleme ve Yönetme: Belirli process’leri izlemek veya bunları binary isme dayanarak yönetmek için idealdir.
  • İyileştirilmiş Sistem Verimliliği: Belirli process’ler üzerinde hedeflenen eylemleri yaparak sistem verimliliğini artırır.