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ısaltma | Ne Zaman Değişir? | touch ile Değişir mi? |
|---|---|---|---|
| Access Time | atime | Dosya okunduğunda | Evet (-a ile) |
| Modification Time | mtime | İçerik değiştiğinde | Evet (-m ile) |
| Change Time | ctime | Metadata değiştiğinde | Dolaylı 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
| Secenek | Uzun Hali | Açıklama | Örnek |
|---|---|---|---|
| -a | –time=atime | Sadece access time güncelle | touch -a dosya.txt |
| -m | –time=mtime | Sadece modification time güncelle | touch -m dosya.txt |
| -c | –no-create | Dosya yoksa oluşturma | touch -c dosya.txt |
| -d | –date=STRING | String ile tarih belirt | touch -d “yesterday” dosya.txt |
| -t | – | Timestamp formatıyla tarih belirt | touch -t 202401150930 dosya.txt |
| -r | –reference=DOSYA | Referans dosyanın zamanını kullan | touch -r ref.txt hedef.txt |
| -h | –no-dereference | Symlink’in kendisini güncelle | touch -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.
