DEVOPS // LİNUXD::02 BAŞLANGIÇ+
20m READCOMPLETION: 89%ID::LNX-101

LİNUX TERMİNAL VE SHELL SCRİPTİNG

Dosya sistemi, süreç yönetimi, ağ komutları ve bash scripting

Linux, sunucu ve geliştirme ortamlarında baskın işletim sistemidir. Bir geliştirici olarak terminal komutlarına hakim olmak, verimliliğinizi ve problem çözme hızınızı dramatik biçimde artırır.

Dosya Sistemi Navigasyonu

// BASH //
# Neredeyim?
pwd                    # /home/ali/projeler
 
# Dizin içeriğini listele
ls                     # Basit liste
ls -la                 # Gizli dosyalar dahil, detaylı
ls -lh                 # Okunabilir boyutlar (KB, MB)
ls -lt                 # Değişiklik zamanına göre sırala
 
# Dizin değiştir
cd /var/log           # Mutlak yol
cd ../..              # İki üst dizine çık
cd ~                  # Home dizini
cd -                  # Önceki dizine dön
 
# Dizin oluştur
mkdir proje
mkdir -p src/components/ui   # İç içe dizinler
 
# Dosya işlemleri
cp kaynak.txt hedef.txt      # Kopyala
cp -r kaynak-klasor/ hedef/  # Klasörü kopyala
mv eski-ad.txt yeni-ad.txt   # Taşı/yeniden adlandır
rm dosya.txt                 # Sil
rm -rf klasor/               # Klasörü zorla sil (DİKKATLİ!)

Dosya İçeriği Görüntüleme

// BASH //
# Kısa dosyalar
cat dosya.txt           # Tamamını göster
head -20 dosya.txt      # İlk 20 satır
tail -20 dosya.txt      # Son 20 satır
tail -f /var/log/app.log # Canlı takip (log izleme)
 
# Uzun dosyalar
less dosya.txt          # Sayfalı okuma (q = çık, / = ara)
more dosya.txt          # Basit sayfalı okuma
 
# Dosya bilgisi
file dosya.bin          # Dosya türü
wc -l dosya.txt         # Satır sayısı
wc -w dosya.txt         # Kelime sayısı
du -sh klasor/          # Dizin boyutu
df -h                   # Disk kullanımı

Arama ve Filtreleme

// BASH //
# grep — metin arama
grep "hata" /var/log/app.log           # Satır ara
grep -i "ERROR" log.txt                # Büyük/küçük harf duyarsız
grep -r "TODO" src/                    # Klasörde recursive ara
grep -n "import" server.ts             # Satır numarası göster
grep -v "DEBUG" log.txt                # Eşleşmeyenleri göster
grep -E "^[0-9]+" veri.txt            # Regex ile ara
 
# find — dosya arama
find . -name "*.log"                   # Uzantıya göre
find . -name "*.ts" -newer package.json # package.json'dan yeni
find /tmp -mtime +7 -delete            # 7 günden eski, sil
find . -type d -name "__pycache__"     # Sadece dizinler
find . -size +10M                      # 10MB'dan büyük
 
# locate — veritabanından hızlı arama
sudo updatedb                         # Veritabanını güncelle
locate nginx.conf

Pipe ve Yönlendirme

// BASH //
# | (pipe) — bir komutun çıktısını diğerine gönder
cat /var/log/auth.log | grep "Failed" | tail -20
ps aux | grep nginx | grep -v grep
 
# > — dosyaya yaz (üzerine yaz)
ls -la > dosya-listesi.txt
 
# >> — dosyaya ekle
echo "Log kaydı $(date)" >> uygulama.log
 
# 2> — hata çıktısını yönlendir
komut 2> hatalar.txt
komut > cikti.txt 2>&1  # Hem normal hem hata aynı dosyaya
 
# /dev/null — çıktıyı yok et
komut > /dev/null 2>&1
 
# tee — hem ekrana hem dosyaya
make build 2>&1 | tee build.log
 
# xargs — çıktıyı argüman olarak kullan
find . -name "*.log" | xargs rm        # Tüm log dosyalarını sil
cat dosyalar.txt | xargs wc -l         # Her dosyanın satır sayısı

Süreç Yönetimi

// BASH //
# Çalışan süreçler
ps aux                                # Tüm süreçler
ps aux | grep "node"                  # Node süreçleri
top                                   # Canlı sistem monitörü
htop                                  # Renkli, interaktif (kurulum gerekli)
 
# Süreç sonlandır
kill 1234                             # PID'e sinyal gönder (varsayılan: SIGTERM)
kill -9 1234                          # Zorla öldür (SIGKILL)
pkill -f "node server.js"             # İsimle öldür
 
# Arka plana gönder
npm run dev &                         # & ile arka plana
nohup npm start &                     # Terminal kapanınca da çalışsın
disown %1                             # Job'ı terminal'dan ayır
 
# Jobs
jobs                                  # Arka plan işleri
fg %1                                 # Öne getir
bg %1                                 # Arka plana gönder
Ctrl+Z                                # Süreci durdur (SIGSTOP)
Ctrl+C                                # Süreci sonlandır (SIGINT)

İzinler (Permissions)

// BASH //
# İzin yapısı: [türü][sahip][grup][diğer]
# -rwxr-xr--   sahip=rwx, grup=r-x, diğer=r--
ls -la script.sh
# -rwxr-xr-x 1 ali developers 1234 Jun 15 14:30 script.sh
 
# chmod — izin değiştir
chmod 755 script.sh      # Sahip:rwx, Grup:r-x, Diğer:r-x
chmod +x script.sh       # Çalıştırma izni ekle
chmod -w config.json     # Yazma iznini kaldır
chmod -R 644 public/     # Recursive
 
# Sayısal izinler
# 4=okuma, 2=yazma, 1=çalıştırma
# 7=rwx, 6=rw-, 5=r-x, 4=r--
 
# chown — sahiplik değiştir
chown ali:developers dosya.txt
chown -R www-data:www-data /var/www/
 
# sudo — yönetici yetkisi
sudo apt update && sudo apt upgrade -y
sudo systemctl restart nginx

Ağ Komutları

// BASH //
# Bağlantı testi
ping google.com
curl -I https://api.example.com       # HTTP başlıkları
curl -s https://api.example.com/health | jq   # JSON formatla
 
# Port kontrol
ss -tulnp                             # Dinleyen portlar
ss -tulnp | grep :3000                # Belirli port
netstat -an | grep LISTEN             # (eski yöntem)
 
# DNS
nslookup google.com
dig google.com
host google.com
 
# Dosya transfer
scp -r yerel/klasor/ kullanici@sunucu:/uzak/yol/
rsync -avz --progress src/ kullanici@sunucu:/hedef/

Shell Scripting Temelleri

// BASH //
#!/bin/bash
# Shebang — hangi interpreter kullanılacağı
 
set -e  # Hata olunca dur
set -u  # Tanımsız değişkende hata
 
# Değişkenler
AD="Ali"
YAS=25
echo "Merhaba, $AD! (${YAS} yaşında)"
 
# Koşullar
if [ -f /etc/nginx/nginx.conf ]; then
  echo "Nginx kurulu"
elif [ -d /usr/local/nginx ]; then
  echo "Nginx farklı konumda"
else
  echo "Nginx bulunamadı"
fi
 
# Döngüler
for DOSYA in *.log; do
  echo "İşleniyor: $DOSYA"
  gzip "$DOSYA"
done
 
# Fonksiyon
log_yaz() {
  local SEVIYE=$1
  local MESAJ=$2
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$SEVIYE] $MESAJ" >> /var/log/script.log
}
 
log_yaz "INFO" "Script başlatıldı"
 
# Argümanlar
if [ $# -lt 1 ]; then
  echo "Kullanım: $0 <ortam>"
  exit 1
fi
 
ORTAM=$1  # İlk argüman

Systemd Servis Yönetimi

// BASH //
# Servis durumu
systemctl status nginx
systemctl status postgresql
 
# Servis yönetimi
sudo systemctl start    nginx
sudo systemctl stop     nginx
sudo systemctl restart  nginx
sudo systemctl reload   nginx    # Config yeniden yükle (yeniden başlatmadan)
 
# Otomatik başlatma
sudo systemctl enable  nginx    # Sistem açılınca başlat
sudo systemctl disable nginx    # Sistem açılınca başlatma
 
# Loglar
journalctl -u nginx              # Servis logları
journalctl -u nginx -f           # Canlı log takibi
journalctl -u nginx --since "1 hour ago"

Sonuç

Linux terminal becerileri bir geliştirici için kritik altyapıdır. Dosya sistemi, süreç yönetimi, ağ komutları ve shell scripting'i kavrayarak sunucu yönetimi, CI/CD otomasyonu ve hata ayıklama süreçlerinizi çok daha verimli hale getirebilirsiniz. Bir sonraki derste SSH ve uzak sunucu yönetimini ele alacağız.