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.