Bash betiğindeki tail komutunun 2 paramdan yalnızca 1 param sağlayarak uzaktan çağrıldığında doğru şekilde çalışmadığı bir sorunum var. Ancak aşağıdaki durumlarda doğru çalışır:
- 1 param ile doğrudan yerelde çalıştırılır
- 2 param ile doğrudan yerelde yürütülen
- 2 param ile uzaktan kontrol
Kuyruğu takip eden betiği aşağıda yazdım. 2 parametre alır:
- TEST ADI: Bu paragraf zorunludur. Bu test davasının adı. Bu isimde bir günlük dosyası oluşturur.
SLAVE_HOST: Bu param isteğe bağlıdır. Sağlanırsa, sağlanan köle ana bilgisayara ssh ve benzer bir komut dosyası başlatacak.
#!/bin/bash TESTNAME="$1" testdate=$(date +'%m_%d_%Y') REG_DIR=/opt/reg-test-results/REG_"$testdate" #create regression results directory if it does not exist mkdir -p "$REG_DIR" FILENAME="$REG_DIR"/"$TESTNAME" #if file already exists, create a new one with current time stamp appended to name if [ -f "$FILENAME" ]; then TIME=$(date +'%m_%d_%Y-%H.%M.%S') FILENAME="$FILENAME"_"$TIME" fi echo "$FILENAME" > /opt/reg-test-results/currentTestName #start tailing nohup tail -f -n0 /path/to/log/files/*/*server.log > "$FILENAME" & echo "$!" > $REG_DIR/reg_tail.pid #if slave host is provided, start tailing logs on slave also if [ "$#" -gt 1 ]; then SLAVE_HOST="$2" ssh "$SLAVE_HOST" /path/to/script/startTailLogTestCaseSlave.sh "$FILENAME" fi
İlk birkaç kod satırı değişkenleri paramda saklar, bir dizin yapısı ve kuyruklu logların yönlendirileceği log dosyası için bir dosya adı oluşturur. Bundan sonra, günlükleri takip etmeye ve günlük dosyasına yönlendirmeye başlamak için bir nohup tail komutuna sahibim. Bu düzgün çalışmayan kod satırıdır. Sonra ikinci bir argüman sağlanmışsa, o ana bilgisayara ssh gönderir ve üzerinde bir komut çalıştırır.
Sorun: Uzaktan çalıştırırken ve her iki paramayı geçerken, bu betiği çalıştırdıktan sonra çalışan bir kuyruk işlemi görüyorum ve günlük dosyasının içeriğe uygun şekilde yerleştirildiğini görüyorum. Ancak, sadece ilk param sağlarsam, o zaman kuyruk başlıyor ve derhal durur çünkü reg_tail.pid dosyasında yeni bir işlem kimliği görüyorum ama günlük dosyası ($ FILENAME) yaratılmadı ve çalışan kuyruk işlemi yok.
Komut doğrudan makinede çalıştırıldığında 1 param veya her ikisi ile de mükemmel çalışır.
"Uzaktan çalıştırırken" derken, makineye ssh demek ve betiği çağırmak istiyorum. Örneğin:
$ ssh -t user@host /path/to/script/script.sh testcasename.log
Hata ayıklama çabası:
Set -x kullandığımda ve uzaktaki makineden çalıştırdığımda gördüğüm şey:
İkinci argüman geçtiğinde ve her şey normal şekilde çalıştığında, en sonunda nohup kuyruğu çalıştırıldığını görüyorum.
....
+ echo 13441
+ '[' 2 -gt 1 ']'
+ SLAVE_HOST=slaveHost
+ ssh slaveHost /path/to/script/startTailLogTestCaseSlave.sh /opt/reg-test- results/REG_09_11_2015/logs2.log
+ nohup tail -f -n0 /path/to/logs/../check-server.log ...
nohup: redirecting stderr to stdout
Connection to hostname closed.
Yalnızca ilk argüman geçildiğinde, nohup kuyruğu asla çalıştırılmaz:
...
+ echo 13607
+ '[' 1 -gt 1 ']'
Connection to hostname closed.
nohup
burada ilk etapta? Bu durumda çıktı dosya tanımlayıcıları ile uğraştığını düşünüyorum.
nohup
ilk etapta Açıklamak, eldeki sorunun debug edilmesine yardımcı olabilir. Olmadan aynı davranışı alırsanız söyleniyor nohup
hiç değilse, o zaman bunun ilk başta kendi probleminizle / sorunuzla hiçbir ilgisi yoktur.
ssh hostB scriptname filename hostC
, ve komut dosyası çağırırssh hostC scriptname filename
? Geri adım atmak ve tasarımınızı basitleştirmek olup olmadığını görmek isteyebilirsiniz. (2) Komut dosyasıtail
önce komutssh "$SLAVE_HOST" …
komut - ama seninset -x
teşhis çıkışı gösterirtail
sonrassh
. Bunu açıklamak ister misin? (3) Olmamak için iyi bir nedeniniz olmadığı sürece, kabuk değişkenlerini her zaman teklif etmelisiniz. emin Ne yaptığını biliyorsun.