uname Komutu ile Sistem Bilgisi Ogrenme Teknikleri

Bir Linux sunucusuna baglandiginda ilk yapman gereken sey sistemi tanimaktir. uname komutu bu is icin en temel araclardan biridir ve dogru kullandiginda sana cok fazla bilgi verir. Bu yazida uname komutunu her acisindan ele alacagiz.

Yeni bir sunucuya SSH ile baglandin. Ne yapiyorsun? Cogu deneyimli sysadmin refleks olarak birkac komut girer – bunlarin basinda uname gelir. Kernel versiyonu ne, mimari 32 bit mi 64 bit mi, hangi isletim sistemindeyiz? Bunlari bilmeden sunucuda is yapmak, haritasiz yabanci bir sehirde araba kullanmaya benzer.

Bu yazida uname komutunu derinlemesine inceleyecegiz. Sadece temel kullanimi degil, gercek dunya senaryolarinda nasil kullandiginizi, scriptlere nasil entegre ettiginizi ve baska hangi komutlarla birlikte guclu bir sistem bilgisi tablosu olusturdugunuzu konusacagiz. Hazirsan baslayalim.

uname Nedir ve Neden Onemlidir?

uname, Unix ve Linux sistemlerde sistem bilgilerini goruntuleyen temel bir komuttur. Adi “Unix Name” kelimelerinin kisaltmasindan gelir. POSIX standartlarina dahil oldugu icin neredeyse her Unix/Linux sistemde bulunur – ister Ubuntu, ister CentOS, ister FreeBSD, ister macOS olsun.

Web sunucusu yonetiyorsan bu komut sana ozellikle kritik anlarda yardimci olur. Mesela bir guvenlik acigi cikmis, CVE numarasi var elimde, etkilenen kernel versiyonunu bilmem gerekiyor. Ya da bir yazilimi derleyeceksin, mimariyi dogrulaman lazim. Belki bir destek bileti aciyorsun ve karsi taraf “kernel versiyonunu gonder” diyor. Tum bu durumlarda uname ilk duragin olacak.

Temel Kullanim: Parametreler ve Ciktilari

Ilk once parametrelere bakalim. uname komutunu parametresiz calistirirsan sadece sistem adini gosterir. Ama asil guc parametrelerde sakli:

# Parametresiz kullanim - sadece kernel adini gosterir
uname
# Cikti: Linux

# Tek tek parametre kullanimi
uname -s   # Kernel adi (System)
uname -n   # Network hostname
uname -r   # Kernel release (versiyon)
uname -v   # Kernel version (derleme bilgisi)
uname -m   # Makine mimarisi
uname -p   # Islemci tipi
uname -i   # Donanim platformu
uname -o   # Isletim sistemi

# Hepsini bir arada gormek icin
uname -a

Simdi bu parametrelerin ne anlama geldigini tek tek konusalim. Cogu zaman sadece uname -a kullanilir ama ne gordugunu anlamak cok onemli.

ParametreAciklamaOrnek Cikti
-sKernel adiLinux
-nHostnamewebserver01.example.com
-rKernel release5.15.0-91-generic
-vKernel version (derleme tarihi)#101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023
-mMakine mimarisix86_64
-pIslemci tipix86_64
-iDonanim platformux86_64
-oIsletim sistemiGNU/Linux
-aTum bilgilerTum alanlari birlestirerek gosterir

uname -a Ciktisini Dogru Okumak

Pratik bir ornek uzerinden gidelim. Tipik bir Ubuntu sunucusunda uname -a ciktisi soyle gozukur:

uname -a
# Linux webserver01 5.15.0-91-generic #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

# Bu ciktiyi parcalayalim:
# Linux             -> Kernel adi (-s)
# webserver01       -> Hostname (-n)
# 5.15.0-91-generic -> Kernel release (-r)
# #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023 -> Kernel version (-v)
# x86_64            -> Makine mimarisi (-m)
# x86_64            -> Islemci tipi (-p)
# x86_64            -> Donanim platformu (-i)
# GNU/Linux         -> Isletim sistemi (-o)

Burada kernel versiyonu olan 5.15.0-91-generic satirini iyi anlamak lazim. Uc bolumden olusuyor: ana versiyon (5), alt versiyon (15), yama seviyesi (0) ve ardinda distroye ozgu ek bilgi. Bu numarayi guvenlik acigi aradigin zaman cok kullaniyor olacaksin.

Ipucu: Kernel versiyonunu CVE veritabanlarinda ararken uname -r ciktisini aynen kullanma. Cogu CVE, upstream kernel versiyonuna gore siniflaydirilir, distro paket numarasina gore degil. Ornegin 5.15.0-91-generic, upstream olarak 5.15 kernel ailesine karsilik gelir.

Gercek Dunya Senaryosu 1: Guvenlik Yamasi Kontrolu

Diyelim ki bir guvenlik acigi haberi okudun. Etkilenen sistemler kernel 5.x serisinin belirli bir versiyonuna kadar olan surumler. Elindeki tum web sunucularini kontrol etmen gerekiyor. Iste bu noktada uname‘i script ile birlestiriyorsun:

#!/bin/bash
# Birden fazla sunucuda kernel versiyonunu kontrol et
# sunucular.txt dosyasinda her satirda bir IP/hostname oldugununu varsayiyoruz

SUNUCU_LISTESI="sunucular.txt"
ETKILENEN_VERSIYON="5.15.0-88"

while IFS= read -r sunucu; do
    echo -n "$sunucu: "
    kernel=$(ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no "$sunucu" 'uname -r' 2>/dev/null)
    if [ $? -eq 0 ]; then
        echo "Kernel: $kernel"
        # Basit versiyon karsilastirmasi
        if [[ "$kernel" == *"$ETKILENEN_VERSIYON"* ]]; then
            echo "  *** DIKKAT: Bu sunucu etkilenebilir! ***"
        fi
    else
        echo "BAGLANTI HATASI"
    fi
done < "$SUNUCU_LISTESI"

Bu script, listendeki sunuculara baglanip kernel versiyonlarini ceker ve etkilenen versiyonla karsilastirir. Otuz sunucuyu tek tek kontrol etmek yerine bunu calistirip kahveni icer, geri dondugun zaman sonuclar seni bekliyor olur.

Gercek Dunya Senaryosu 2: Mimari Bazli Paket Yukleme

Web sunucularinda bazen 32 bit ve 64 bit sistemler karisik kullanilabilir (evet, hala boyle ortamlar var). Yazdigin deployment scriptinin dogru mimariye gore paket indirmesi gerekiyor. Iste uname -m burada devreye giriyor:

#!/bin/bash
# Mimariye gore dogru binary indir ve yukle

MIMARU=$(uname -m)
APP_VERSION="2.4.1"
BASE_URL="https://releases.example-app.com"

case "$MIMARI" in
    x86_64)
        PACKAGE_URL="${BASE_URL}/app-${APP_VERSION}-linux-amd64.tar.gz"
        echo "64-bit sistem tespit edildi, amd64 paketi indiriliyor..."
        ;;
    aarch64|arm64)
        PACKAGE_URL="${BASE_URL}/app-${APP_VERSION}-linux-arm64.tar.gz"
        echo "ARM64 sistem tespit edildi, arm64 paketi indiriliyor..."
        ;;
    armv7l)
        PACKAGE_URL="${BASE_URL}/app-${APP_VERSION}-linux-armv7.tar.gz"
        echo "ARMv7 sistem tespit edildi, armv7 paketi indiriliyor..."
        ;;
    i686|i386)
        PACKAGE_URL="${BASE_URL}/app-${APP_VERSION}-linux-386.tar.gz"
        echo "32-bit sistem tespit edildi, 386 paketi indiriliyor..."
        ;;
    *)
        echo "Bilinmeyen mimari: $MIMARI"
        exit 1
        ;;
esac

wget -q "$PACKAGE_URL" -O /tmp/app.tar.gz
tar -xzf /tmp/app.tar.gz -C /opt/
echo "Kurulum tamamlandi."

Bu tarz scriptler ozellikle Ansible playbook yazmadan once prototip cikarmak icin cok isiniza yarar. Mimariye gore dallandirma yaparak hem tek scriptle tum ortamlari yonetebilirsin hem de hata riskini minimize edersin.

uname’in Sinirlamalari ve Tamamlayici Komutlar

uname guclu bir arac ama tek basina tam resmi vermez. Mesela hangi Linux dagitimini kullandigini soylemez. Ubuntu mu, CentOS mu, Debian mi? Bunu anlamak icin baska kaynaklara bakman gerekiyor:

# Distro bilgisi icin - modern sistemlerde calisir
cat /etc/os-release

# Eski sistemlerde
cat /etc/issue

# lsb_release komutu (varsa)
lsb_release -a

# Tum sistem bilgisini toplu gormek icin
echo "=== KERNEL ==="
uname -a
echo ""
echo "=== DISTRO ==="
cat /etc/os-release 2>/dev/null || cat /etc/issue 2>/dev/null
echo ""
echo "=== CPU MIMARISI ==="
uname -m
echo ""
echo "=== HOSTNAME ==="
hostname -f 2>/dev/null || uname -n

Web sunucusu yonetiminde bu bilgilerin hepsini bir arada gormek cok isine yarar. Ozellikle bir destek sureci baslayinca veya yeni bir ekip uyesi sunucuya el atacaksa bu bilgileri bir README dosyasina veya wiki’ye not etmek iyi bir aliskanlik.

hostnamectl ile Gelismis Sistem Bilgisi

Systemd kullanan modern sistemlerde hostnamectl komutu daha zengin cikti verir. uname ile birlikte kullaninca cok kapsamli bir sistem profili cikartabilirsin:

# hostnamectl cok daha detayli bilgi verir
hostnamectl

# Tipik cikti:
#  Static hostname: webserver01
#        Icon name: computer-server
#          Chassis: server
#       Machine ID: a1b2c3d4e5f6...
#          Boot ID: x9y8z7w6...
# Operating System: Ubuntu 22.04.3 LTS
#           Kernel: Linux 5.15.0-91-generic
#     Architecture: x86-64

# Sadece mimari almak icin
hostnamectl | grep Architecture

# Sadece OS bilgisi
hostnamectl | grep "Operating System"

# uname ile karsilastirmali rapor
echo "uname ciktisi:"
uname -a
echo ""
echo "hostnamectl ciktisi:"
hostnamectl

Web Sunucusu Ortamlarinda Pratik Kullanim Senaryolari

Web sunucusu yonetirken uname‘e en cok ihtiyac duydugun durumlar sunlar:

  • Nginx veya Apache’nin belirli bir versiyonu kernel ozelligi gerektiriyorsa uyumlulugu kontrol etmek
  • Let’s Encrypt/Certbot kurulumu oncesinde sistem gereksinimlerini dogrulamak
  • Docker veya container teknolojisi kurmadan once kernel versiyonunu kontrol etmek
  • eBPF tabanli monitoring araclari icin kernel gereksinimine bakmak
  • SSL/TLS ayarlari icin kernel crypto subsystem versiyonunu anlamak
  • Load balancer veya firewall kurulumu oncesinde netfilter/nftables destegini kontrol etmek

Bunlarin cogu icin sadece uname -r ciktisina bakman yeterli. Ama bazi durumlarda daha derin bir kontrol gerekebilir. Mesela Docker icin minimum kernel gereksinimini kontrol eden basit bir script:

#!/bin/bash
# Docker kurulumu icin kernel gereksinimleri kontrolu

KERNEL_VERSION=$(uname -r)
ARCH=$(uname -m)

echo "Sistem Bilgisi:"
echo "  Kernel: $KERNEL_VERSION"
echo "  Mimari: $ARCH"
echo ""

# Kernel versiyonunu parcalara ayir
MAJOR=$(echo "$KERNEL_VERSION" | cut -d. -f1)
MINOR=$(echo "$KERNEL_VERSION" | cut -d. -f2)

echo "Kernel Ana Versiyon: $MAJOR"
echo "Kernel Alt Versiyon: $MINOR"
echo ""

# Docker icin minimum kernel 3.10
if [ "$MAJOR" -gt 3 ] || ([ "$MAJOR" -eq 3 ] && [ "$MINOR" -ge 10 ]); then
    echo "GECTI: Kernel versiyonu Docker icin yeterli (min. 3.10)"
else
    echo "BASARISIZ: Kernel versiyonu cok eski! Docker icin en az 3.10 gerekli."
    exit 1
fi

# Mimari kontrolu
if [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "aarch64" ]; then
    echo "GECTI: Desteklenen mimari tespit edildi."
else
    echo "UYARI: Bu mimari ($ARCH) icin Docker destegi sinirli olabilir."
fi

echo ""
echo "Kontrol tamamlandi."

Uyari: Kernel versiyonu tek basina yeterli degildir. Docker gibi araclarin cgroup versiyonu, namespace destegi ve baska kernel modulleri gibi gereksinimleri de vardir. Yukaridaki script temel bir on kontrol icin kullanilabilir, resmi kurulum dokumantasyonunu her zaman takip et.

Monitoring ve Loglama Icin uname Kullanimi

Sistem izleme scriptleri yazarken log kayitlarina sistem bilgisini eklemek cok iyi bir aliskanlik. Logdaki bir hataya bakarken hangi kernel ve mimari oldugunu bilmek zaman kazandirir. Ozellikle farkli versiyonlarda farkli davranislar gosteren problemlerde bu bilgi altin degerinde:

#!/bin/bash
# Sistem bilgisini log dosyasina yaz
# Bu scripti cron ile gunluk calistirabilisin

LOG_DIR="/var/log/sysinfo"
LOG_FILE="${LOG_DIR}/system_snapshot_$(date +%Y%m%d).log"

mkdir -p "$LOG_DIR"

{
    echo "======================================"
    echo "Sistem Anlık Goruntu - $(date '+%Y-%m-%d %H:%M:%S')"
    echo "======================================"
    echo ""
    echo "[KERNEL BILGISI]"
    echo "Tam uname -a ciktisi: $(uname -a)"
    echo "Kernel adi: $(uname -s)"
    echo "Kernel versiyonu: $(uname -r)"
    echo "Kernel derleme: $(uname -v)"
    echo "Mimari: $(uname -m)"
    echo "Hostname: $(uname -n)"
    echo ""
    echo "[OS BILGISI]"
    if [ -f /etc/os-release ]; then
        grep -E '^(NAME|VERSION|ID)=' /etc/os-release
    fi
    echo ""
    echo "[SISTEM KAYNAKLARI]"
    echo "CPU cekirdek sayisi: $(nproc)"
    echo "Toplam RAM: $(free -h | awk '/^Mem:/ {print $2}')"
    echo "Disk kullanimi:"
    df -h / | tail -1
    echo ""
    echo "======================================"
} >> "$LOG_FILE"

echo "Sistem bilgisi kaydedildi: $LOG_FILE"

Bu scripti /etc/cron.daily/ altina koyarsan her gun otomatik olarak calisir ve sistemin gecmisini kayit altina alirsin. Kernel guncellemenin ardinda hangi versiyona gectinizi, ne zaman gectinizi bu loglardan takip edebilirsin.

macOS ve Diger Unix Sistemlerinde uname

Sadece Linux degil, macOS da dahil hemen her Unix sisteminde uname calisir. Gelistirme ortaminda Mac kullanip production’da Linux calistiriyorsan bunu bilmen faydali. Aralarindaki farklara dikkat et:

  • macOS’ta uname -s ciktisi “Darwin” olarak gelir
  • macOS’ta uname -r Darwin kernel versiyonunu verir, macOS surumunu degil
  • FreeBSD’de uname -s ciktisi “FreeBSD” olarak gelir
  • Cross-platform script yazarken uname -s ile OS kontrolu yapmak iyi bir pratik

Eger hem Linux hem macOS’ta calisacak bir script yaziyorsan, bunu su sekilde handle edebilirsin:

#!/bin/bash
# Cross-platform sistem bilgisi - Linux ve macOS destekli

OS_TYPE=$(uname -s)

case "$OS_TYPE" in
    Linux)
        echo "Linux sistem tespit edildi."
        echo "Kernel: $(uname -r)"
        echo "Mimari: $(uname -m)"
        if [ -f /etc/os-release ]; then
            DISTRO=$(grep '^NAME=' /etc/os-release | cut -d= -f2 | tr -d '"')
            echo "Dagitim: $DISTRO"
        fi
        PAKET_YONETICISI="apt-get veya yum"
        ;;
    Darwin)
        echo "macOS (Darwin) tespit edildi."
        echo "Darwin kernel: $(uname -r)"
        echo "macOS surumu: $(sw_vers -productVersion 2>/dev/null || echo 'bilinmiyor')"
        echo "Mimari: $(uname -m)"
        PAKET_YONETICISI="brew"
        ;;
    FreeBSD)
        echo "FreeBSD tespit edildi."
        echo "Versiyon: $(uname -r)"
        PAKET_YONETICISI="pkg"
        ;;
    *)
        echo "Bilinmeyen sistem: $OS_TYPE"
        PAKET_YONETICISI="bilinmiyor"
        ;;
esac

echo "Onerilecek paket yoneticisi: $PAKET_YONETICISI"

Sonraki Adimlar

uname komutuna hakim olduktan sonra sistem bilgisi toplama konusunda kendini daha da gelistirebilecegin bir yol haritasi sunuyorum:

  • procfs’i ogrenin: /proc/version, /proc/cpuinfo, /proc/meminfo gibi dosyalar uname’den cok daha derin sistem bilgisi verir. Bunlari okumak icin ek bir komuta gerek yok, sadece cat yeterli.
  • dmidecode komutuna bakin: Donanim bilgisi (BIOS versiyonu, RAM slotlari, anakart modeli) icin dmidecode vazgecilmezdir. Root yetkisi gerektirir.
  • lscpu ve lsblk ogrenin: CPU detaylari icin lscpu, disk yapisi icin lsblk harika tamamlayicilardır. uname ile birlikte kullandiginda tam bir donanim profili cikarabilirsin.
  • Ansible facts mekanizmasina bakin: Birden fazla sunucu yonetiyorsan Ansible’in otomatik olarak toplayan ansible_facts modulu seni cok ugrastirici manuel islerden kurtarir.
  • Monitoring sistemine entegre et: Prometheus, Grafana veya benzeri araclara uname bilgilerini label olarak ekleyebilirsin. Boylece metriklerine bakarken hangi kernel versiyonunda oldugunu aninda gorursun.
  • Kernel changelog takibi: uname -r ile ogrendigin versiyon numarasini kernel.org veya distronun changelog sayfasiyla eslestirerek sisteme ne zaman hangi degisikliklerin geldigi hakkinda bilgi sahibi olabilirsin.

uname komutu tek basina kucuk ve sade gorunebilir, ama dogru kullanildiginda sistem yonetiminin temel taslarindan biridir. Guvenlik kontrollerinde, deployment scriptlerinde, troubleshooting sureclerinde ve otomasyonda surekli isinize yarayacak. Scriptlerine entegre et, loglarina ekle ve her yeni sunucuya baglandiginda ilk reflekslerinden biri haline getir.

clear Komutu: Terminal Ekranını Temizleme ve Bilmen Gereken Her Şey

Terminal ekranın kaotik bir hale mi geldi? clear komutu ve Ctrl+L kısayolu günlük işlerini çok daha temiz hale getirir. Bu yazıda clear komutunun tüm inceliklerini, alternatiflerini ve sysadmin senaryolarındaki kullanımını ele alıyoruz.

Uzun bir troubleshooting seansının ardından terminale bakıyorsun ve ekran komut çıktılarıyla, hata mesajlarıyla, log satırlarıyla dolup taşmış durumda. Neyin nerede olduğunu bulmak için scroll yapıp duruyorsun. İşte tam bu noktada terminaldeki en basit ama en kurtarıcı komutlardan biri devreye giriyor: clear. Günde onlarca kez kullandığın bu küçük komutun aslında bilmediğin pek çok yönü var. Gelin hepsini konuşalım.

<!– wp:heading {

touch Komutu: Dosya Oluşturma ve Zaman Damgası Değiştirme

touch komutu göründüğünden çok daha güçlü bir araç. Sadece boş dosya oluşturmakla kalmıyor, web sunucusu yönetiminde kritik öneme sahip zaman damgası işlemlerini de üstleniyor. Bu yazıda touch komutunu her yönüyle inceliyoruz.

Sysadmin kariyerinde bir noktada şunu fark ediyorsun: en basit görünen komutlar çoğu zaman en çok işe yarayan komutlar oluyor. touch da tam olarak bu kategoride. “Ne kadar karmaşık olabilir ki, dosya oluşturuyorsun işte” diye düşünebilirsin. Ama web sunucusu yönetimi söz konusu olduğunda bu küçük komut seni ciddi baş ağrılarından kurtarabilir, ya da yanlış kullanırsan ciddi sorunlara davet edebilir. Hadi konuya girelim.

touch Komutu Nedir ve Ne Yapar?

touch, temel olarak iki işi yapan bir komut. Birincisi, var olmayan bir dosyayı oluşturur. İkincisi, var olan bir dosyanın erişim (access) ve değiştirme (modification) zaman damgalarını günceller. Çoğu insan sadece birinci kullanımı bilir ama asıl güç ikincisinde.

Man page’e baktığında seni karşılayan tanım şudur: “touch — change file timestamps”. Dosya oluşturmak aslında bir yan etki. Eğer belirttiğin dosya yoksa, touch onu oluşturur. Varsa, sadece zaman damgasını günceller. Bu ayrımı aklında tutmak önemli.

Temel Kullanım: Dosya Oluşturma

En basit kullanımıyla başlayalım. Web sunucusu ortamında sıklıkla boş dosya oluşturman gerekir. Maintenance sayfaları, lock dosyaları, pid dosyaları veya sadece test amaçlı placeholder dosyalar…

# Tek dosya oluşturma
touch maintenance.html

# Birden fazla dosyayı tek seferde oluşturma
touch index.html style.css app.js

# Belirli bir dizinde dosya oluşturma
touch /var/www/html/.maintenance

# Birden fazla log dosyası oluşturma
touch /var/log/myapp/{error,access,debug}.log

Süslü parantez kullanımına dikkat et. Bu bash’ın brace expansion özelliği ve touch ile birleşince çok kullanışlı bir hal alıyor. Tek komutla birden fazla dosya oluşturabiliyorsun.

Bilgi: touch ile oluşturulan dosya tamamen boştur, 0 byte boyutundadır. İçine bir şey yazmak istiyorsan farklı komutlara ihtiyacın olacak. touch sadece dosyanın var olmasını sağlar.

Zaman Damgaları: Asıl Mesele Burada

Linux’ta her dosyanın üç tür zaman damgası vardır. Bunları bilmeden touch’ı gerçek anlamda kullanamazsın.

Zaman DamgasıKısaltmaNe Zaman Değişir?touch ile Değişir mi?
Access TimeatimeDosya okunduğundaEvet (-a ile)
Modification Timemtimeİçerik değiştiğindeEvet (-m ile)
Change TimectimeMetadata değiştiğindeDolaylı olarak

touch varsayılan olarak hem atime’ı hem de mtime’ı şu anki zamana günceller. ctime ise her zaman otomatik güncellenir çünkü bir şeyleri değiştirdiğinde dosyanın metadata’sı da değişmiş olur.

Mevcut Zaman Damgalarını Görüntüleme

Önce mevcut durumu nasıl göreceğini bilelim. stat komutu bu iş için biçilmiş kaftan:

# Dosyanın tüm zaman damgalarını göster
stat /var/www/html/index.html

# Örnek çıktı:
#   File: /var/www/html/index.html
#   Size: 10674     Blocks: 24         IO Block: 4096   regular file
# Device: fd00h/64768d    Inode: 785432      Links: 1
# Access: (0644/-rw-r--r--)  Uid: (   33/www-data)   Gid: (   33/www-data)
# Access: 2024-01-15 14:23:45.123456789 +0300
# Modify: 2024-01-14 09:15:22.987654321 +0300
# Change: 2024-01-14 09:15:22.987654321 +0300

# Sadece modification time'ı görmek için
date -r /var/www/html/index.html

touch Seçenekleri ve Parametreler

Komutun seçeneklerine geçelim. Bunları bilmeden touch’ın yarısını kullanmıyorsun demektir.

# Sadece access time'ı güncelle (-a)
touch -a /var/www/html/index.html

# Sadece modification time'ı güncelle (-m)
touch -m /var/www/html/index.html

# Dosya yoksa oluşturma, sadece varsa güncelle (-c veya --no-create)
touch -c /var/www/html/opsiyonel-dosya.html

# Belirli bir zaman damgası belirt (-t)
# Format: [[CC]YY]MMDDhhmm[.ss]
touch -t 202401150930.00 /var/www/html/index.html

# Belirli bir tarihi string olarak belirt (-d)
touch -d "2024-01-15 09:30:00" /var/www/html/index.html
touch -d "yesterday" /var/www/html/index.html
touch -d "2 hours ago" /var/www/html/index.html
touch -d "next monday" /var/www/html/index.html

# Başka bir dosyanın zaman damgasını kopyala (-r)
touch -r /var/www/html/referans.html /var/www/html/hedef.html

Ipucu: -d seçeneği oldukça esnek bir format kabul ediyor. “yesterday”, “last week”, “2 hours ago” gibi insan okunabilir ifadeler de çalışıyor. Bu özelliği özellikle test senaryolarında çok işe yarar buluyorum.

Web Sunucusu Senaryolarında Gerçek Dünya Kullanımı

Teoriden pratiğe geçelim. Web sunucusu yönetiminde touch’ı en çok nerede ve nasıl kullanıyorsun, bunlara bakalım.

1. Maintenance Modu Lock Dosyası

Laravel, Symfony gibi PHP framework’leri maintenance modunu genellikle bir dosyanın varlığına göre kontrol eder. touch burada biçilmiş kaftan:

# Laravel maintenance modunu aktif et (manuel yöntem)
touch /var/www/html/myapp/storage/framework/down

# Birden fazla sanal sunucu için aynı anda maintenance aç
for site in site1 site2 site3; do
    touch /var/www/html/${site}/storage/framework/down
    echo "${site} maintenance moduna alindi"
done

# Maintenance bitti, lock dosyasını kaldır
rm /var/www/html/myapp/storage/framework/down

# Nginx için maintenance flag dosyası
touch /var/run/nginx-maintenance
# nginx.conf'ta bu dosyanın varlığını kontrol edip 503 döndürebilirsin

2. PHP-FPM ve Nginx Cache Yönetimi

Web sunucusu caching mekanizmaları zaman damgalarına büyük önem verir. mtime değiştiğinde cache geçersiz sayılır. Bu davranışı touch ile kontrol edebilirsin:

# PHP-FPM'i yeniden başlatmadan opcache'i temizlemek için
# (bazı yapılandırmalarda dosya değişikliği opcache invalidation'ı tetikler)
touch /var/www/html/myapp/public/index.php

# Nginx fastcgi_cache'i belirli dosyalar için geçersiz kıl
# cache key dosyasının timestamp'ini güncelle
touch /var/cache/nginx/cache-purge-trigger

# Tüm PHP dosyalarının mtime'ını güncelle (dikkatli kullan!)
find /var/www/html/myapp -name "*.php" -exec touch {} ;

# Sadece belirli bir dizindeki dosyaları güncelle
find /var/www/html/myapp/app -name "*.php" -maxdepth 2 -exec touch {} ;

Uyari: find ile birlikte toplu touch kullanımı çok sayıda dosyayı etkiler. Production ortamında bunu yapmadan önce tam olarak ne yapacağını bildiğinden emin ol. Yanlış dizinde çalıştırırsan beklenmedik cache invalidation sorunlarıyla karşılaşabilirsin.

3. Log Dosyası Yönetimi

Yeni bir web uygulaması deploy ederken log dosyalarının önceden oluşturulmuş ve doğru izinlerle hazır olması gerekir. Uygulama başladığında log dosyası yoksa hata verebilir:

# Uygulama log dosyalarını oluştur ve izinleri ayarla
LOG_DIR="/var/log/mywebapp"

# Dizini oluştur
mkdir -p ${LOG_DIR}

# Log dosyalarını oluştur
touch ${LOG_DIR}/error.log
touch ${LOG_DIR}/access.log
touch ${LOG_DIR}/slow-query.log

# Sahipliği ve izinleri ayarla
chown -R www-data:www-data ${LOG_DIR}
chmod 640 ${LOG_DIR}/*.log

# Doğrulama
ls -la ${LOG_DIR}/

4. Deployment Script’lerinde touch Kullanımı

CI/CD pipeline’larında ve deployment script’lerinde touch oldukça sık kullanılır. İşte tipik bir deployment senaryosu:

#!/bin/bash
# deploy.sh - Basit web uygulaması deployment scripti

APP_DIR="/var/www/html/myapp"
DEPLOY_TIME=$(date +%Y%m%d_%H%M%S)

echo "[${DEPLOY_TIME}] Deployment basliyor..."

# 1. Maintenance modunu aktif et
touch ${APP_DIR}/storage/framework/down
echo "Maintenance modu aktif"

# 2. Yeni kodları cek (git, rsync vb.)
git -C ${APP_DIR} pull origin main

# 3. Config dosyalarının varlığını garantile
touch ${APP_DIR}/.env
touch ${APP_DIR}/storage/logs/laravel.log

# 4. Cache dosyalarının timestamp'ini güncelle
# Bu sayede PHP opcache yeni kodu alacak
find ${APP_DIR}/bootstrap/cache -name "*.php" -exec touch {} ;

# 5. Deployment zaman damgasını kaydet
touch ${APP_DIR}/storage/deployed_at
echo "Son deployment: ${DEPLOY_TIME}" > ${APP_DIR}/storage/deployed_at

# 6. Maintenance modunu kapat
rm -f ${APP_DIR}/storage/framework/down
echo "Deployment tamamlandi. Maintenance modu kapatildi."

Zaman Damgasını Taklit Etmek: Dikkatli Ol

touch’ın güçlü özelliklerinden biri geçmişe veya geleceğe tarih atayabilmek. Bu özellik bazen meşru ihtiyaçlar için kullanılır, örneğin bir dosyayı eski bir yedeğe senkronize etmek. Ama aynı zamanda kötüye kullanılabilecek bir özellik.

# Dosyayı belirli bir tarihe "götür"
touch -d "2023-06-15 12:00:00" /var/www/html/eski-icerik.html

# Bir dosyanın zaman damgasını başka bir dosyayla eşitle
# Örnek: yedekten gelen dosyayla production'ı senkronize et
touch -r /backup/2024/index.html /var/www/html/index.html

# Belirli bir formatta zaman damgası ata
# Format: CCYYMMDDhhmm.ss
touch -t 202406151200.00 /var/www/html/special-file.html

Uyari: Dosya zaman damgalarını manipüle etmek güvenlik loglarını ve audit trail’leri bozabilir. Forenzik inceleme gerektiren sistemlerde ya da compliance zorunluluğu olan ortamlarda zaman damgasını geriye almak ciddi sorunlara yol açabilir. Bu özelliği ne zaman ve neden kullandığını belgele.

Atomik Dosya Oluşturma ve Race Condition

Yüksek trafikli web sunucularında birden fazla process aynı anda çalışıyor olabilir. touch’ın atomik olmayan bir operasyon olduğunu bilmek gerekiyor. Yani iki process aynı anda aynı dosyayı oluşturmaya çalışırsa race condition oluşabilir. Lock mekanizması için touch’a güvenmemelisin.

Bunun yerine gerçek lock dosyası oluşturma için daha güvenilir yöntemler var:

# touch ile basit varlık kontrolü (lock için YETERSİZ)
if [ ! -f /tmp/myapp.lock ]; then
    touch /tmp/myapp.lock  # Race condition riski var!
    # işlemler...
    rm /tmp/myapp.lock
fi

# Daha güvenilir lock için flock kullan
flock -n /tmp/myapp.lock -c "bash /var/www/html/myapp/cron/cleanup.sh"

# Ya da mkdir kullan (atomik operasyon)
if mkdir /tmp/myapp.lockdir 2>/dev/null; then
    echo $$ > /tmp/myapp.lockdir/pid
    # işlemler...
    rm -rf /tmp/myapp.lockdir
else
    echo "Baska bir process calisıyor, cikiliyor."
    exit 1
fi

Bilgi: mkdir operasyonu atomiktir çünkü işletim sistemi seviyesinde tek bir sistem çağrısıyla gerçekleşir. Bu yüzden lock mekanizması olarak mkdir, touch’a göre çok daha güvenilirdir. Bu küçük ama önemli bir fark.

Otomatik Görevlerde touch Kullanımı

Cron job’larında ve otomatik bakım scriptlerinde touch sıklıkla kullanılır. İşte birkaç pratik örnek:

# Crontab'dan çalışacak bir bakım scripti
#!/bin/bash
# /usr/local/bin/webserver-health-check.sh

HEALTH_FILE="/var/run/webserver-health"
LOG_FILE="/var/log/health-check.log"

# Nginx çalışıyor mu kontrol et
if systemctl is-active --quiet nginx; then
    # Sağlık dosyasının timestamp'ini güncelle
    # Monitoring sistemi bu dosyanın tarihini izleyebilir
    touch ${HEALTH_FILE}
    echo "$(date): Nginx sagliklı" >> ${LOG_FILE}
else
    # Dosyayı silme veya güncelleme, monitoring alarm verir
    echo "$(date): Nginx calısmiyor! Alarm!" >> ${LOG_FILE}
    # Alert gönder
    /usr/local/bin/send-alert.sh "Nginx down" "critical"
fi

# Log dosyasını rotasyona hazırla
# Son güncelleme üzerinden 7 gün geçmişse sıfırla
find ${LOG_FILE} -mtime +7 -exec sh -c 'cat /dev/null > {}' ;

Sık Yapılan Hatalar

Yıllar içinde gördüğüm ve bizzat yaptığım bazı hataları paylaşayım:

  • Var olan bir dosyayı touch’lamak içeriğini silmez ama aklından çıkarabilir. Dosyayı truncate etmek istiyorsan farklı bir yöntem kullanmalısın.
  • touch için hedef dizin mevcut olmalıdır. Dizin yoksa touch hata verir. Önce mkdir -p ile dizini oluştur.
  • touch’ın başarıyla çalışması için ilgili dizinde write iznine ihtiyacın var. Web sunucusu dizinlerinde root veya www-data olarak çalışman gerekebilir.
  • Symlink’leri touch’larken dikkatli ol. Varsayılan olarak touch symlink’in kendisini değil, işaret ettiği dosyayı günceller. Symlink’in kendisini güncellemek için -h veya –no-dereference seçeneğini kullan.
  • NFS mount edilmiş dosya sistemlerinde zaman senkronizasyon sorunları olabilir. touch -t ile kesin bir zaman belirtmek bazen daha güvenlidir.

Hızlı Referans Tablosu

SecenekUzun HaliAçıklamaÖrnek
-a–time=atimeSadece access time güncelletouch -a dosya.txt
-m–time=mtimeSadece modification time güncelletouch -m dosya.txt
-c–no-createDosya yoksa oluşturmatouch -c dosya.txt
-d–date=STRINGString ile tarih belirttouch -d “yesterday” dosya.txt
-tTimestamp formatıyla tarih belirttouch -t 202401150930 dosya.txt
-r–reference=DOSYAReferans dosyanın zamanını kullantouch -r ref.txt hedef.txt
-h–no-dereferenceSymlink’in kendisini güncelletouch -h link.txt

Özet

touch komutu basit görünür ama web sunucusu yönetiminde düşündüğünden çok daha fazla yerde karşına çıkar. Maintenance lock dosyaları, cache invalidation, log dosyası hazırlama, deployment scriptleri… Bunların hepsi touch’ın doğal habitatı. Özellikle zaman damgası manipülasyonu özelliğini ve -r, -d seçeneklerini bilmek seni ortalama kullanıcıdan bir adım öne çıkarır.

En önemli nokta şu: touch’ı bir lock mekanizması olarak kullanma. Race condition’lara açık. Bunun için flock veya mkdir kullan. Geri kalan her şeyde touch oldukça güvenilir ve hızlı bir araç.

Sonraki Adımlar

touch’ı sindirdiysen, birlikte çok güzel çalıştığı araçlara da bakmanı öneririm:

  • stat komutu: Dosya zaman damgalarını ve metadata’yı detaylı görüntülemek için
  • find komutu: Zaman damgasına göre dosya aramak için (-mtime, -atime, -newer seçenekleri)
  • flock komutu: Gerçek dosya kilitleme mekanizması için
  • inotifywait: Dosya değişikliklerini gerçek zamanlı izlemek için
  • logrotate: Log dosyası rotasyonunu otomatikleştirmek için

Bu araçları birlikte öğrenmek, web sunucusu yönetiminde dosya operasyonlarını çok daha verimli yapmanı sağlayacak. Her biri ayrı bir yazı konusu, sırasıyla ele alacağız.