Temmuz 19 2024

Zabbix 7.x ile Kubernetes Cluster Monitoring

Kubernetes ekosisteminde monitoring denildiğinde akla ilk gelen Prometheus-Grafana ikilisi olsa da, modern devops dünyasında zabbix 7.x sürümüyle kartları yeniden dağıtıyor. Bu yazımızda, legacy sistemlerden aşina olduğumuz bu devasa canavarın, kubernetes cluster’larındaki container metriklerini auto-discovery (LLD) yetenekleriyle nasıl saniyeler içinde yakaladığını, verileri nasıl işlediğini ve Grafana ile nasıl görselleştirdiğini ele alacağız. “Prometheus kurduk ama RAM tüketimi ocağımıza incir ağacı dikti” diyenlerdenseniz, kemerlerinizi bağlayın; Zabbix 7.x’in hafif ve güçlü Kubernetes entegrasyonuna dalıyoruz.

Neden Zabbix 7.x? (Eski Dostun Yeni Numaraları)

Yıllarca Zabbix’i sadece VM’lerin CPU ve disk doluluk oranlarını izlemek için kullandıysanız, kendinizi güncellemenin vakti geldi demektir. Zabbix 7.x, Kubernetes dünyasını yabancı bir gezegen gibi görmüyor. HTTP agent, out-of-the-box gelen gelişmiş Kubernetes template’leri ve JSONPath preprocessing yetenekleri sayesinde API Server üzerinden doğrudan cluster’ın kalbine inebiliyor.

Peki neden Prometheus yerine Zabbix? Cevap basit: Unified Monitoring ve Uzun Vadeli Veri Saklama (Long-term Retention). Eğer cluster dışında fiziksel switch’leriniz, legacy veritabanlarınız ve sanal makineleriniz varsa, hepsini tek bir panele toplamak ve bunu yaparken TSDB (Time Series Database) kaynaklı çılgın RAM maliyetlerinden kaçınmak istiyorsanız, Zabbix 7.x tam size göre.

Adım 1: Kubernetes Cluster Üzerinde Zabbix Helm Deployment

Zabbix’in cluster içindeki gözü kulağı olacak Zabbix Agent 2 ve Zabbix Proxy yapılandırmasını kurarak işe başlıyoruz. Kubernetes API’si ile güvenli bir şekilde konuşabilmek için service account ve rol tanımlamalarına ihtiyacımız var. Neyse ki resmi Helm chart bu işi bizim yerimize hallediyor.

İlk olarak Zabbix topluluk reposunu sistemimize ekleyelim:

helm repo add zabbix-community https://zabbix-community.github.io/helm-charts
helm repo update

Şimdi, cluster metriklerini toplamak için optimize edilmiş bir values.yaml dosyası hazırlayalım. Bu dosyada Zabbix Server adresimizi ve cluster adımızı belirtiyoruz. Aşağıdaki konfigürasyonu zabbix-values.yaml olarak kaydedebilirsiniz:

zabbixProxy:
  enabled: true
  resources:
    limits:
      cpu: 500m
      memory: 512Mi
    requests:
      cpu: 100m
      memory: 128Mi
  env:
    - name: ZBX_HOSTNAME
      value: "k8s-production-proxy"
    - name: ZBX_SERVER_HOST
      value: "zabbix-server.kertenkerem.local" # Zabbix Server IP veya FQDN'iniz

zabbixAgent:
  enabled: true
  resources:
    limits:
      cpu: 200m
      memory: 256Mi
    requests:
      cpu: 50m
      memory: 64Mi
  env:
    - name: ZBX_HOSTNAMEITEM
      value: "system.hostname"

Bu konfigürasyon ile cluster içinde bir DaemonSet olarak Zabbix Agent 2 ve cluster dışındaki ana sunucumuza verileri güvenli ve sıkıştırılmış şekilde iletecek bir Zabbix Proxy ayağa kaldırıyoruz. Kurulumu şu komutla tetikleyelim:

kubectl create namespace monitoring
helm install zabbix zabbix-community/zabbix-helm-ch --namespace monitoring -f zabbix-values.yaml

Adım 2: Auto-Discovery (LLD) ile Metrik Avcılığı

Kubernetes dinamik bir yapıya sahiptir; pod’lar saniyeler içinde ölür, yenileri doğar. Statik IP’ler veya host tanımlamaları burada sökmez. Zabbix 7.x, bu kaosu çözmek için Low-Level Discovery (LLD) mekanizmasını kullanır. Kubernetes API Server üzerinden pods, nodes, namespaces ve services discovery kurallarını çalıştırır.

Zabbix Web UI arayüzüne giriş yaptıktan sonra şu adımları izleyin:

1. API Token Oluşturma

Zabbix Server’ın cluster API’si ile konuşabilmesi için Helm kurulumu sırasında otomatik oluşturulan service account token’ını almamız gerekiyor:

kubectl get secret $(kubectl get serviceaccount zabbix-service-account -n monitoring -o jsonpath="{.secrets[0].name}") -n monitoring -o jsonpath="{.data.token}" | base64 --decode

Not: Kubernetes 1.24 ve üzeri kullanıyorsanız, secret manuel oluşturulmuş olabilir. Helm chart bunu sizin için halletmediyse, service account için bir `kubernetes.io/service-account-token` tipinde Secret oluşturup token’ı oradan okumalısınız.

2. Zabbix Üzerinde Host Tanımlama

  • Configuration -> Hosts -> Create Host yolunu izleyin.
  • Host Name alanına Kubernetes Cluster Production yazın.
  • Templates kısmına “Kubernetes by HTTP” template’ini ekleyin. Bu template, Zabbix 7.0 ile gelen out-of-the-box harika bir canavardır.
  • Macros sekmesine geçiş yapın ve aşağıdaki kritik değişkenleri tanımlayın:
{$KUBE.API.URL} -> https://<kubernetes-api-endpoint>:6443
{$KUBE.API.TOKEN} -> <Bir önceki adımda elde ettiğiniz token>

Bu tanımlamadan sonra Zabbix, HTTP agent yardımıyla cluster API’nize sorgu atmaya başlayacak. Birkaç dakika içinde “Discovery rules” altındaki kuralların tetiklendiğini ve cluster’ınızdaki tüm node’ların, pod’ların ve container’ların otomatik olarak sisteme “Graph” ve “Item” olarak eklendiğini göreceksiniz. İşte auto-discovery’nin gücü!

Adım 3: Grafana Entegrasyonu (Görsel Şölen)

Zabbix’in kendi arayüzündeki grafikler son yıllarda iyileşmiş olsa da, hiçbirimiz yöneticilerimize veya development ekiplerine o 90’lardan kalma görünümlü panelleri göstermek istemeyiz. Bize Grafana lazım.

Grafana üzerinde Zabbix veri kaynağını (datasource) aktifleştirmek için şu adımları izliyoruz:

grafana-cli plugins install alexanderzobnin-zabbix-app
systemctl restart grafana-server

Grafana arayüzüne gidip Connections -> Data Sources -> Add New Data Source dedikten sonra listeden Zabbix’i seçiyoruz. Konfigürasyon ayarlarında dikkat etmeniz gereken kritik noktalar şunlar:

  • URL: http://zabbix-server-ip/zabbix/api_jsonrpc.php
  • Access: Server (Default)
  • Zabbix API Connection: Zabbix admin kullanıcı adı ve şifreniz.

Bağlantıyı test edip kaydettikten sonra, Kubernetes cluster metriklerimizi içeren dashboard’ları tasarlayabiliriz. Örneğin, her pod’un CPU tüketimini dinamik olarak çeken bir panel yazmak istersek, Grafana query alanına şu regex’i girebiliriz:

Group: Kubernetes
Host: /.*/
Application: CPU
Item: /Calculated CPU usage percent/

Bu sorgu sayesinde, cluster’a yeni bir mikroservis deploy edildiğinde hiçbir manuel müdahale yapmadan o servisin CPU grafiği saniyeler içinde Grafana panelinizde belirecektir.

Adım 4: Akıllı Alerting Kuralları

Gecenin saat 3’ünde “Pod restart attı” diye uyanmak istemiyorsanız, Zabbix’in esnek trigger yapısını doğru kurgulamanız gerekir. Klasik CPU doldu alert’leri yerine Kubernetes dünyasına uygun akıllı trigger’lar yazmalıyız.

Örnek 1: CrashLoopBackOff Durumu tespiti

Bir pod sürekli hata alıp kapanıyorsa ve restart sayısı artıyorsa, bu kritik bir durumdur. Zabbix template’i içinde gelen varsayılan kuralı özelleştirebiliriz:

last(/Kubernetes by HTTP/kube.pod.restart_rate[{#POD.NAME}]) > 3 and last(/Kubernetes by HTTP/kube.pod.status[{#POD.NAME}]) = 0

Bu trigger, pod’un son 5 dakika içindeki restart hızı 3’ten fazla ise ve pod “Ready” durumunda değilse alarm üretir. Geçici network kesintilerinde boşuna Slack kanallarınızı spam’lemez.

Örnek 2: Node Disk Basıncı (Disk Pressure)

Kubelet’in node üzerindeki pod’ları evict etmeye başlamadan (yani sistem dışına atmadan) önce diskin dolduğunu anlamamız gerekir:

last(/Kubernetes by HTTP/kube.node.status.disk_pressure[{#NODE.NAME}]) = 1

Bu alarm tetiklendiğinde, Zabbix’in Webhook entegrasyonu sayesinde Slack veya PagerDuty üzerinden anlık bildirim alabilir, hatta otomatik aksiyon (Remote Command) tanımlayarak ilgili node üzerindeki gereksiz docker imajlarını temizleyen bir script çalıştırabilirsiniz.

Zabbix 7.x Kubernetes Monitoring’in Avantaj ve Dezavantajları

Her sistemde olduğu gibi bu mimarinin de güçlü ve zayıf yanları var. Kararınızı vermeden önce bunları masaya yatıralım:

Avantajları Dezavantajları
Düşük kaynak tüketimi (RAM/CPU dostu) Kubernetes native olmaması (Prometheus operator kadar cluster içine entegre değil)
Merkezi yönetim ve güçlü LLD yetenekleri Custom Metric API ile HPA (Horizontal Pod Autoscaler) entegrasyonu görece zor
Uzun vadeli verileri saklamada veritabanı esnekliği (PostgreSQL/TimescaleDB) Grafana template kütüphanesinin Prometheus kadar zengin olmaması

Sonuç

Zabbix 7.x, Kubernetes cluster’larını izlemek için hantal ve “outdated” bir çözüm olmaktan çok uzak. Aksine, kaynak tüketimini minimize etmek isteyen ve tüm IT altyapısını (fiziksel, sanal, container) tek bir merkezi noktadan yönetmeyi hedefleyen kıdemli sistem ve devops mühendisleri için biçilmiş kaftan. Auto-discovery mekanizmasının gücü ve Grafana’nın görsel yetenekleri birleştiğinde, production ortamınızda uçtan uca izlenebilirlik (observability) sağlamak işten bile değil.

Siz de cluster’larınızda Zabbix kullanmayı denediniz mi? Yaşadığınız tecrübeleri veya takıldığınız yerleri yorumlarda bizimle paylaşın, debugging seansına beraber devam edelim!

Category: Genel | LEAVE A COMMENT
Temmuz 19 2024

Python ile SSL Sertifikalarının Süresi Dolmuş mu? – Eğlenceli Bir Yolculuk

Merhaba kod meraklıları! Bugün sizi, SSL sertifikalarının süresi dolmuş mu dolmamış mı kontrol etmeye yarayan eğlenceli ve basit bir Python yolculuğuna çıkaracağım. Hazır mısınız? Hadi başlayalım!

İnternetin Kapı Bekçileri: SSL Sertifikaları

SSL sertifikaları, internetin kapı bekçileri gibidir. Bu küçük dijital belgeler, tarayıcınızın ve web sitenizin güvenli bir şekilde iletişim kurmasını sağlar. Peki, bu sertifikaların süresi dolarsa ne olur? İşte tam burada Python devreye giriyor! Hazır olun salıyorum kobrayı 🐍 !

Python ile Macera Başlıyor

Python ile bir SSL sertifikasının bitiş tarihini kontrol etmek, bir atom reaktörünü çalıştırmak kadar basittir. İşte size bunu nasıl yapacağınızı anlatan eğlenceli bir kod:


import ssl
import socket
from datetime import datetime

def get_ssl_expiry_date(hostname):
    context = ssl.create_default_context()
    with socket.create_connection((hostname, 443)) as sock:
        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
            ssl_info = ssock.getpeercert()
            expiry_date_str = ssl_info['notAfter']
            expiry_date = datetime.strptime(expiry_date_str, '%b %d %H:%M:%S %Y %Z')
            return expiry_date

def check_ssl_expiry(hostname):
    try:
        expiry_date = get_ssl_expiry_date(hostname)
        now = datetime.utcnow()
        days_left = (expiry_date - now).days
        return f"SSL certificate for {hostname} expires on {expiry_date}. Days left: {days_left}"
    except Exception as e:
        return f"An error occurred: {e}"

# Kullanım
hostname = 'kertenkerem.net'
print(check_ssl_expiry(hostname))

Kodun Anatomisi

SSL ve Socket Kütüphaneleri: ssl ve socket kütüphaneleri, Python dünyasında güvenlik büyüleri yapmanızı sağlar. Bir tür Harry Potter değneği gibi düşünebilirsiniz!

Bağlantı Kurma: Bir domain’e bağlanıp, SSL sertifikasını alıyoruz. Bu, sanki bir kapıyı çalıp, “Hey, bana kim olduğunu göster!” demek gibi.

Sertifika Bilgilerini Alma: Kapı açıldığında, bize sertifikasını gösteriyor. Biz de bu sertifikayı alıp bitiş tarihini öğreniyoruz.

Bitiş Tarihini Kontrol Etme: Sertifikanın ne zaman süresinin dolacağını öğrenip, kaç gün kaldığını hesaplıyoruz.

Eğlenceli Bir Örnek

Farz edelim ki bir kafe işletiyorsunuz ve kahve makinenizin servis tarihini kontrol etmek istiyorsunuz. Ama bu kez kahve makinesi yerine SSL sertifikalarını kontrol ediyoruz. Ve işte kodumuz, kahve makinesi gibi çalışıp, “Bu sertifika şu tarihte süresi dolacak. Servis zamanı!” diyor.

hostname = 'kertenkerem.net'
print(check_ssl_expiry(hostname))

Bu satırı çalıştırdığınızda, size domain’in SSL sertifikasının ne zaman süresinin dolacağını ve kaç gün kaldığını söyleyecek.

Sonuç

Gördüğünüz gibi, Python ile SSL sertifikalarının bitiş tarihini kontrol etmek hem basit hem de eğlenceli olabilir. Kendi güvenlik kapı bekçilerinizi kontrol edin ve her zaman güvende kalın. Kodlamaya devam edin ve internetin sihirli dünyasında kaybolun!

Happy coding! 🚀

Category: Genel | LEAVE A COMMENT
Eylül 9 2022

Taşındık 100mt ilerdeyiz (Docker)

Siz de benim gibi docker’a ait her şeyi ayrı bir diskte tutmaktan yanaysanız aşağıdaki script sizi havalara uçurabilir!

Bu script kısaca şunları yapıyor:

  • Çalışan Docker servisini durduruyor
  • Yeni path oluşturuyor
  • Eski path içindeki herşeyi yeni yerine taşıyor
  • Docker servisini yeni path’ e göre düzenliyor
  • Eskilerin yedeğini alıyor
  • Yeni path için sembolik link oluşturuyor
  • Systemd servislerini reload ediyor
  • Docker servisini yeniden başlatıyor
  • docker info komutunddan yeni root path’ini okuyor.
#!/bin/bash
#KertenKerem Gururla Sunar
#Taşımak İstediğiniz Dosya Yolunu "dockerdir_new" değişkenine yazmalısınız

dockerdir_new='/media/dockerdiski/var'
dockerdir_old='/var/lib/docker/'
set -e

dockerdir_new2=$(echo "$dockerdir_new" | sed 's/\//\\\//g')

systemctl stop docker
mkdir -p $dockerdir_new
rsync -a $dockerdir_old* $dockerdir_new

sed -i.bak "/ExecStart=\/usr\/bin\/dockerd \-H fd:\/\//c ExecStart=\/usr\/bin\/dockerd \-H fd:\/\/ -g ${dockerdir_new2}" /lib/systemd/system/docker.service

mv $dockerdir_old /var/lib/docker.bak/
ln -s $dockerdir_new /var/lib/docker

systemctl daemon-reload
systemctl start docker.service

printf '\n* Dockera ait eski systemd konfigürasyonu burada bulunmaktadır: /lib/systemd/system/docker.service.bak\n* Eski Docker kök dizini buraya kopyalanmıştır: /var/lib/docker.bak/\n\n'

docker info | grep 'Root Dir'
Category: Genel | LEAVE A COMMENT
Şubat 18 2022

Az dur, Şimdi Code’ lucam!

Evet yeni başlık ile yeni bir bölüm başlıyor. Aslında Az dur! Şimdi Koducam! yazacaktım ama Türkçe koydum, kodum, nasıl da koduk, koyuyorum, koyacağım gibi koymalı kelimeler konunun bağlamından uzaklaşacağı gerekçesiyle fiil olan kelimeyi öz İngiliz Türkçe’ si olan “Kodlayacağım” olarak değiştirmeye karar verdim.

Onu da günlük kullanımdaki haliyle ve kelimenin anlamına vurgu yapmak için öz İngiliz Türkçe’ sindeki gibi Code’lucam olarak yazmaya karar verdim. Tüm bunlara karar verirken yeni bir değişimin de ilk günü olması ve stres seviyemin azıcık yüksek olması da bu başlığı açmama bir etken olabilir.

Yeteri kadar girizgah yapıp konuyla ilgili işe yarar tek kelime etmemek de ancak benim gibi bir Kerten’ e yakışırdı doğrusu.

Bu bölümde günlük hayatta işinize yarayacak geneli python veya javascript olan kod parçaları paylaşacağım.

İlk örneği bir python bağımlısı olduğum için bu dilde vereceğim.

Yazdığınız kodların ne kadar sürede çalışıp tamamlandığını görmeye ihtiyacınız olabilir. bu kod parçacığını kendi kod bloklarınız içine yerleştirerek bir kronometre gibi ölçüm alabilirsiniz.

import time
start = time.perf_counter()
time.sleep(1) # do work
elapsed = time.perf_counter() - start
print(f'Time {elapsed:0.4}')
>>>>Time 1.001
Category: Genel | LEAVE A COMMENT
Ocak 26 2022

Bilmende Fayda Var (Vcenter)

Eğer esxi üzerine yeni Vcenter kuracaksanız aşağıda yazdıklarım bir gün işinize yarayacaktır. Olur da vcenter çalışmaz ve esxi’ a yeniden bağlanmak zorunda kalırsanız esxi Lockdown Mode olacağı için bağlanamazsınız.

Aşağıdaki komutlar lockdown modu disable etmek için kullanılır. Bunun için PowerCLI denen bir vmware tool’ una ihtiyacınız var onu da şurada bulabilirsiniz: https://developer.vmware.com/web/tool/12.5.0/vmware-powercli

Kendisi bir powershell modülü olup vcenter ve esxi ortamlarınıza powershell ile erişebilmenizi sağlar.

$vCenter = 'vCenterServerIPadres' # Sizin VCenter ip adresiniz
Connect-VIServer $vCenter
 $Scope = Get-VMHost # Vcenterdan yönetilen tüm VMlerin Lockdown Modunu etkileyeceğiz
 foreach ($ESXhost in $Scope) {
 (get-vmhost $ESXhost | get-view).ExitLockdownMode() # Lockdown Mode' u DISABLE etmek için
 # (get-vmhost $ESXhost | get-view).EnterLockdownMode() # Lockdown Mode' u Enable etmek için başındaki yorum tagini silin
 }
Disconnect-VIServer -Server $vCenter -Confirm:$false

Category: Genel | LEAVE A COMMENT
Aralık 7 2021

Yaz bak, sonra unutursun (Part1)

Python Tarih / Saat biçimleri

Python’ da bir şeyler yazarken neredeyse en çok uğraştıran konu tarihleri istediğim formata sokmak. Bu nedenle aşağıdaki kısa örnekleri buraya ekliyorum ilerde de dönüp bakabileyim diye.

Lokal zamanı ISO 8601 formatına çevirmek

*now yerine utcnow da kullanabilirisiniz.

import datetime 
datetime.datetime.now().isoformat() 
>>> 2021-12-06T14:28:23.382748

Lokal zamanı ISO 8601 formatına mikrosaniyeler olmadan çevirmek

import datetime 
datetime.datetime.now().replace(microsecond=0).isoformat() 
>>> 2021-12-06T14:30:43

UTC olan zamanı timezone bilgisi ile ISO 8601 formatına çevirmek

import datetime 
datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat() 
>>> 2021-12-06T01:31:12.467113+00:00 

Tarih verisini istediğiniz biçimde gösterebilmek için “strftime” özelliğini kullanarak tarih / saat verinizi biçimlendirebilirsiniz. Bunun için gerekli gösterim parametreleri aşağıdaki tabloda görüldüğü gibidir.

import datetime
x = datetime.datetime.now()
print(x.strftime("%Y-%m-%d %H:%M:%S"))
%aHaftanın Günü Kısa gösterimWed
%AHaftanın Günü Uzun gösterimWednesday
%wHaftnın kaçıncı günü olduğu (0-6 arasında, 0 Pazar)3
%dAyın kaçıncı günü olduğu (01-31 arasında)31
%bAyın adı Kısa gösterimDec
%BAyın adı Uzun gösterimDecember
%mAyın sayısal gösterimi 01-1212
%yYılın son iki hanesi18
%YYılın uzun gösterimi2018
%HSaat 00-23 arası17
%ISaat 00-12 arası5
%pAM/PM BilgisiPM
%MDakika 00-59 arası41
%SSaniye 00-59 arası8
%fMilisaniye 000000-999999 arası548513
%zUTC offset100
%ZTimezoneCST
%jYılın kaçıncı günü olduğu 001-366 arası365
%UHaftanın ilk gününü pazar kabul ederek yılın kaçıncı haftası olduğu 00-53 arası52
%WHaftanın ilk gününü pazartesi kabul ederek yılın kaçıncı haftası olduğu 00-53 arası52
%cYerel gösterimle tarih ve saat bilgisiMon Dec 31 17:41:00 2018
%CYüzyıl gösterimi20
%xYerel gösterimle sayısal tarih bilgisi 12/31/2018
%XYerel gösterimle saat bilgisi17:41:00
%%“%” İşareti%
%GISO 8601 formatında yıl2018
%uISO 8601 formatında haftanın günü (1-7)1
%VISO 8601 formatında hafta sayısı (01-53)1

Category: Genel | LEAVE A COMMENT
Aralık 1 2021

Bilmende Fayda Var (Linux Tips)

Bak bu yazıda bir sürü şey var. Gerçek diyorum. Okuyabilecek kadar dayanabilirsen senin için çok iyi olur, çok da iyi güzel olur. Lakin ki öyle de değildir. Kimsenin process’ ine herkes karışamaz.

Kill the process be hacı beybi!
ps ax | grep <kapanacak_uygulama_adı> | grep -v grep | awk '{print $1}' | xargs kill

Sürekli çalıştırıp ardından düzenleme yapmak için kapatmanız gereken bir scriptiniz varsa yukardaki komut satırı sizi büyük bir dertten kurtarabilir.

Örneğin servis.py isimli dosyayla sürekli uğraşmanız gerekmekte. Adı üstünde “servis” belli ki arka planda sürekli çalışacak ve hiç kapanmayacak. Taa ki siz isteyene kadar. Olur da kapatmak gerekirse yukardaki gibi bir satırlık kod sizi arka planda çalışan tüm PID’ leri bulup tek tek kill <pid> komutu gönderme zahmetinden kurtarıyor.

Şimdi bu satırı biraz açalım. Açalım ki bize de yazmaya değer bir yazı çıksın 🙂

ps ax

Linux kullananlar zaten biliyordur. Yeni başlayanlar için kopya vereyim “ps” (process / işlem). Yani sistemde çalışan herşeyi göster bakayım komutu.

Sonrasında gelen “a” (show process for ALL users). Yani herkesin çalışmakta olan tüm işlerini göster. “-a” değil sakın karıştırmayın.

Şimdi geldi bilinmeyeni bilmeye: “x”(also show processes not attached to a terminal). Yani arka planda çalışıp görükmeyenleri de gösteriver.

Buraya kadar ne oldu? Arkaplanda çalışan uygulamalar da dahil kimsenin gizlisi saklısı kalmadı. Herşey meydanda. Tabii bu kadar çok olunca bir şekilde ayıklamak lazım. İşte ikinci komut :

grep <kapanacak_uygulama_adı>

grep: Grep, belirtilen bir kalıpla eşleşme içeren satırlar için bir veya daha fazla girdi dosyası arar ve eşleşen satırların çıktısını verir. Yani kısaca aradığın kelime / kelime grubu / sayısal değer/ ne yazdıysan işte onu konsol çıktılarında arar. Aslında bu doğru tabir de değil. grep’ in kullanım klavuzunu zahmet edip biraz okursanız daha net anlarsınız.

Sıkı durun 3. komut da GREP. sıkıldıkça grep, her derde grep, yaşasın grep!!!

grep -v grep 

Ne demiş bir klavye fedaisi: Grep: Grep’ i Grep’le, Grep’çe, Grep’ li ya da Grep’siz arama çabasıdır. İşte bu sözü kendimize düstur ediniyoruz ve konsol çıktımızdaki grep’ li satırları da temizliyoruz. Bunun sonucunda sadece kapatmak istediğimiz uygulama ile ilgili bilgiler ekranda kalıyor.

4. Komut için esas duruşa geçin çünkü AWK geliyor!

awk '{print $1}' 

Şimdi yazacaklarım AWK’ a bir küfür gibi olacak ama en basit haliyle awk: satırlar arasındaki boşlukları kullanarak kelimeleri ayrıştırır. LPIC sınavında bile çıkacak kadar önemli bir komuttur. Bir de yanında olmazsa olmazı SED komutu vardır. Bu ikisini bil, sonra tüm Marvel Evreni, DC Evreni ne kadar süper kahraman varsa tokatla. Türk işi tahin pekmez gibidir ikisi. GOD Mode ON!!! Şu örnekle daha iyi anlarsınız ne demek istediğimi:

echo "selam dostum naber?" | awk '{print $2}'
dostum

echo ile bir cümle yazdırdım ekrana ve çıktısındaki ikinci kelimeyi ayıkladım. Sonuc: “dostum” kelimesi geldi ekrana. Eğer print $2 yerine print $0 yazsaydım bu sefer “selam dostum naber?” yazacaktı çünkü $0 çıktının tümünü verir. Siz de çeşitli denemeler yaparak daha iyi kavrayabilirsiniz bu komutu. Ben en çok csv dosyalarında istediğim sütunlara hızlıca bakmak için kullanırım. echo ” selam dostum naber?” | awk ‘{print $1″ “$3}’ bakın bakalım ne geliyor ekrana?

Kısa bir Awk güzellemesinden sonra konumuz dönelim. Komuttaki awk ‘{print $1}’ komutu, grep ile ayıkladığımız çalışan işlemlere ait PID numaralarını (process ID) döndürmekte.

xargs kill

İşe geldik sona Xargs: Xargs ile bir komuttan gelen standart çıktıyı başka bir komuta argüman olarak yönlendirebilirsiniz. Bizim örnekte bu çıktılar PID listesi olacak: İşte feraset, işte firefox’ a ait PID’ ler!.

ps ax | grep firefox | grep -v grep | awk '{print $1}'
10368
10432
10464
10523
10586
10618
10689
10847
13173
17819
17949
18056
18395

xargs kill ile yukarda gördüğünüz tüm PID numaraları kill komutuna argüman olarak gitmekte ve kaç tane PID varsa o kadar sayıda kill komutu çalışarak ortalığın kill’ına koymakta. Kill’em All hadi sağlıcakla kalın. Eyyorlamam bu kadar.

Category: Genel | Bilmende Fayda Var (Linux Tips) için yorumlar kapalı
Mayıs 27 2021

Bilmende Fayda Var (Linux Tips)

dd ile diske imaj atarken hem kör, hem sağır üstelik ebleh olmamanız için öncelikle sisteminize pv komutunu yüklemenizi şiddetle tavsiye ederim. Ardından aşağıdaki komutu kullanarak olanı biteni daha net takip edebilirsiniz.

(pv -n /dev/sda | dd of=/dev/sdb bs=128M conv=notrunc,noerror) 2&gt;&amp;1 | dialog --gauge "DD komutu calisiyor. (Diskten Diske), az bi durun..." 10 70 0
Category: Genel | LEAVE A COMMENT
Mayıs 27 2021

Bilmende Fayda Var (Ubuntu Tips)

Yeni bir ubuntu server kurduktan yaptıktan sonra sistemde bir sürü gereksiz servis çalışmaya başlıyor. Bunlardan biri de SNAP. Snap diyince hemen snapchat diye düşünmeyin. Bu ürün bir paket yöneticisidir. Docker gibi ama daha çok gui uygulamalar için düşünülmüş bir teknoloji. Minimal bir ubuntu server kurmak istediğinizde hiç bir paket seşmeseniz bile snap otomatik olarak kurulu gelmektedir. SNAP’ in faydalı olduğunu ve uygulamanın bağımlılıkları ile uğraşmama gibi avantajları olduğunu düşünenler olabilir. Fakat Alpine gibi en az kaynağı tüketecek bir ubuntu sunucu kurmak niyetindeyseniz SNAP ve beraberinde gelen paketlerden kurtulmanızı öneririm.

SNAP
Snapcraft

Snap’ i sisteminizden kaldırmak için aşağıdaki komutlarla hızlı bir şekilde işinizi tamamlayabilirsiniz.

sudo snap remove $(snap list | awk '!/^Name/ {print $1}')
sudo apt remove --purge -y snapd

Yukardaki komutları kısaca açıklayalım:

sudo snap remove $(snap list | awk '!/^Name/ {print $1}')

Snap list komutunun çıktısını AWK ile filtreleyelim ve “Name” ile başlayan satır hariç tüm satırları bir psudo değişkene atayalım. Sonrasında snap ile yüklenmiş tüm paketleri kaldırmak için sudo snap remove <paket_adı> komutu ile tek tek paketleri kaldırmak yerine aynı komutu değişken içindeki tüm paket adları için tekrarlayalım.

sudo apt remove --purge -y snapd

Ardından snapd paketini sistemden kadırıp kurulum dosyalarını da temizleyelim. Oh mis çiçek gibi oldu.

Category: Genel | LEAVE A COMMENT
Mayıs 20 2021

Bilmende Fayda Var (Arch Tips)

pacman -Rs $(pacman -Qqtd)
Arch Linux

Yukardaki komut ile Orphaned (öz Türkçesi “pij, gayri müştakil” yani sildikten sonra bağımlısı olduğu ama artık gereksiz olan) dosyaları temizleyerek sisteminizde fazladan yer açabilirsiniz 😉

Category: Genel | LEAVE A COMMENT