- Bash betiklerinde web sunucusu durum kontrolü için tekrarlı bağlantı denemeleri yapılırken, sunucu beklenmedik şekilde sonsuz döngüye girebilir
- Bunu çözmek için kullanılan
timeout, bir komut için yürütme süresi sınırı belirler ve süre aşılırsa sinyal göndererek süreci sonlandırmayı dener
until gibi shell built-in yapılarında doğrudan kullanılamaz; bunun yerine bash sürecini sarmalama veya betiği ayırma yöntemleriyle çözülebilir
Bash betiklerinde web sunucusunu bekleme ve sonsuz döngü sorunu
- Gerçek iş ortamında Bash betikleriyle web sunucusu kurulumu ve durum kontrolü yapılıyor
- Yapı, sunucu ayağa kalkana kadar sonraki işleri bekletiyor ve normalde sorunsuz çalışıyor
- Ancak sunucu başlarken bir çökme yaşanırsa sonsuz döngüye girme durumu ortaya çıkıyor ve bunun çözülmesi gerekiyor
until kullanım örneği ve sınırları
timeout yardımcı aracının devreye alınması
timeout komutu, belirlenen süre içinde bir komut tamamlanmazsa sonlandırmak için sinyal (SIGTERM vb.) gönderir
- Örnek:
timeout 1s sleep 5 durumunda, 1 saniye geçtikten sonra sleep sürecini sonlandırma girişiminde bulunur
- Sonlandırıldığında normal dışı bir çıkış kodu döndürür (ör. 124)
timeout ile until birlikte kullanma denemesi ve sorunlar
Çözüm: Bash sürecini sarmalama veya harici betik kullanma
1 yorum
Hacker News görüşleri
En sevdiğim az bilinen numaralardan biri, çeşitli sistem çağrısı hatalarını test etmek için
strace fault injectionkullanma yöntemiİlgili bağlantıda daha ayrıntılı açıklanıyor.
Bu özelliğin gerçekten müthiş olduğu, bunu daha önce bilmiş olmayı isterdim diye bir deneyim paylaşılmış.
Hata dallarını test etmenin bir yolu olmadığı için bazen fonksiyonun bir kısmını geçici kodla değiştiriyordum; bu numara sayesinde daha sade bir yaklaşım mümkün görünüyor.
Bunun gerçekten faydalı göründüğü söylenmiş.
Windows'ta da benzer bir özellik olup olmadığı merak ediliyor.
Servis health check için en iyi yöntemin hem azami zaman aşımı süresini hem de azami yeniden deneme sayısını birlikte ayarlamak olduğu öneriliyor.
Genelde en fazla X kez yeniden denenir ve en fazla Y süre içinde başarısız kabul edilir.
Çok uzun süre beklemektense mümkün olduğunca hızlı şekilde başarısız kararı vermek gerektiği vurgulanıyor.
Standart servislerde health check, ancak container bağımlılıkları yeterince sağlanıp gerçekten çalışmaya hazır olduktan sonra başlamalı.
Kubernetes'te Init Container, AWS ECS'te
dependsOn, Docker Compose'tadepends_onayarlarına bakılabilir.POSIX shell script örneği verilmiş.
Ancak
curliçinde bu işlev zaten yer aldığı için ayrıca script yazmadan aşağıdaki gibi kullanılabileceği belirtiliyor.Mac'te
timeoutkomutu varsayılan olarak gelmediği için yalnızca bash built-in'leriyle zaman aşımı uygulamaya çalıştığı deneyimini paylaşmış.sleepkomutunun POSIX standardında yer aldığı, dolayısıyla kullanılabildiği açıklanıyor.Aşağıdaki gibi zaman aşımı işlevi uygulama örneği verilmiş.
times_upadlı bir fonksiyonla zaman aşımı ele alınıyor.10 saniyelik zaman aşımıyla
fordöngüsünün 20 kez çalıştırıldığı bir test örneği de verilmiş.12 yıl önce Stack Overflow tavsiyesine uyarak benzer bir yöntem uyguladığını paylaşmış.
Referans bağlantısında ayrıntılar görülebilir.
Yalnızca shell built-in'leri ve
sleepkullanıldığı, ayrıca kodun POSIX uyumlu olmasının zorunlu olduğu vurgulanıyor.Örnekteki bash
{1..20}sözdiziminin POSIX olmadığı, bu yüzden dikkat edilmesi gerektiği belirtiliyor.Kendi iyileştirmesinin, zaman aşımı olmazsa
true, olursafalsedöndürmek olduğu; böylece script içinde hata işlemenin kolaylaştığı anlatılıyor.Aşağıdaki gibi komut ile
sleep'i paralel çalıştırıp, belirtilen sürenin sonunda sinyalle komutu sonlandıran çok basit bir yöntem de paylaşılmış.13 yıl önce
read -tkullanarak zaman aşımı uygulayan bir script örneği paylaşılmış.Bağlantı
curliçinde zaten--retry-connrefusedbayrağı bulunduğu, bu yüzden shell döngüsü kurmadan bu özelliğin doğrudan kullanılabileceği belirtiliyor.bash -ckullanırken değişken aktarmak gerekiyorsa aşağıdaki gibi argüman ekleme yöntemi öneriliyor."--"kullanılma nedeni veargv[0]'ın rolü açıklanıyor.printf %qde kullanılabilir ama Bourne uyumlu yaklaşımın tercih edildiği söyleniyor."--"işaretinin bash ve çoğu Unix/Linux CLI ortamında seçeneklerin bittiğini bildiren çok açık bir anlam taşıdığı açıklanıyor.İlgili referans
Busybox'un
argv[0]değerine göre hangi programı çalıştıracağını belirlediği, dolayısıyla"ls","mv","cp"gibi istenen komutun atanabileceği paylaşılmış.Yeniden deneme mantığı gerektiğinde genelde aşağıdaki yöntemi kullandığını söylüyor.
Çok şık olmasa da çoğu zaman doğru çalıştığı, daha ileri aşamada üstel backoff uygulanabileceği belirtiliyor.
Ölçeklenebilirlik açısından da avantaj sağladığı söyleniyor.
shellcheck'in bu durumda
_değişkenini kullanmayı önerdiği belirtilmiş.Referans bağlantısı
eventually_succeedsfonksiyonunun duruma göretimeoutya da ek savunmacı kodlama gerektirebileceği vurgulanıyor.POSIX/process/IO alanlarında her zaman savunmacı kod yazma gereği hatırlatılıyor.
Geçmişte çocukları küçükken, 30 dakika boyunca yalnızca bir program izleyebilmeleri için aşağıdaki komutu bir tür ebeveyn kontrol aracı olarak kullandığını paylaşmış.
Fikrin son derece kullanışlı olduğu söyleniyor.
Alt süreçlere sinyal göndermesi gerektiği için komutu satır içine yazmayı veya geçici script dosyası kullanmayı pek sevmediğini söylüyor.
Tercih ettiği yöntem, istenen karmaşık mantığı bir fonksiyon haline getirip
exportetmek ve ardından bunutimeout bash -cile sarmalamak.Bunun, aidenn0'un bahsettiği güvenli argüman aktarma yöntemiyle de ilişkili olduğu belirtiliyor.
"$@"ifadesinin mutlaka kullanılması gerektiği belirtiliyor.Aksi halde boşluk içeren argümanlar doğru şekilde iletilmiyor.
Bunu doğrulamak için bir
long_fnörneği de paylaşılmış.Geçmişte
timeouthakkında yazdığı bir blog gönderisini hatırlatıyor.İlgili blogda, shell yerine genel programlama dilleriyle ya da iç çalışma mantığıyla daha çok ilgilenenler için ek bilgi öneriliyor.
Kubernetes kurulumlarında komut zaman aşımı eklediği deneyimini paylaşıyor.
await-cmd.sh,await-http.sh,await-tcp.shgibi POSIX shell script'lerinin olgunlaştığı ve belli durumlarda oldukça faydalı olabildiği belirtiliyor.İlgili proje bağlantısı