komut nohup kuyruk kabuk betiğinde yönlendirme ile belirli bir durumda uygun şekilde başlatılmadı


-2

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:

  1. TEST ADI: Bu paragraf zorunludur. Bu test davasının adı. Bu isimde bir günlük dosyası oluşturur.
  2. 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.

(1) Vay canına. HostA'da oturum açtınız ve yazdınız ssh hostB scriptname filename hostC, ve komut dosyası çağırır ssh 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 komut ssh "$SLAVE_HOST" … komut - ama senin set -x teşhis çıkışı gösterir tail sonra ssh. 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.
Scott

Neden ihtiyaç duyuyorsun nohup burada ilk etapta? Bu durumda çıktı dosya tanımlayıcıları ile uğraştığını düşünüyorum.
Breakthrough

Herkese teşekkürler. @Scott, 1 numaraya dikkat çekti. Teşekkürler. # 2 hakkında, görüyorum budur. Ben nedenini bilmiyorum. Kuyruk her zaman sonunda ikinci tartışmaya girdiğimde idam ediliyor. SLAVE_HOST için "null" değerine sahip bir dize geçirmek ve değer "null" ise ssh değil koşulu eklediği gibi birçok varyasyon denedim. Yalnızca ssh komutu uygulandığında kuyruğu başlatır ve kuyruk komutu ssh'den önce olmasına rağmen ssh'den sonra kuyruğu başlatır. Yaklaşık # 3, her zaman tırnak kullanmak için kodumu güncelledi.
Neha Sharma

@Breakthrough, nohup kaldırma yardımcı olmadı.
Neha Sharma

@NehaSharma Neden eklediniz 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.
Breakthrough

Yanıtlar:


0

Ben kuyruk komutundan sonra bir gecikme ekleyerek sorunu çözdü.

nohup tail -f -n0 /path/to/log/files/*/*server.log > "$FILENAME" 2> test.err < /dev/null &
echo "$!" > "$REG_DIR"/reg_tail.pid

#without this delay, the above tail command is not being executed when only one 1 argumet is passed
sleep 1

#if slave host is provided, start tailing logs on slave also
if [ "$#" -gt 1 ]; then

Ssh komutunun ilgisiz olmasına rağmen idam edildikten sonra neden çalıştığını merak ediyordum. Böylece bir gecikme eklemeye karar verdim. Ben uzman değilim, ancak bir yarış koşulu gibi görünüyor. Kuyruk arka plan işleminin sonunda çalışması planlanıyordu ve ssh komutunun uygulanmadığı durumda, komut dosyası çıkmış ve kuyruk işleminin çalıştırılması için bir şansı olmadan oturum sona erdi. Ana sürecin uyku moduna geçirilmesi, işlemin (veya ipliğin) işlenmesi için kuyruk oluşturma şansı verir. Buna göre, bu çözümün en iyisi olduğundan emin değilim. Uyku yerine beklediğim takdirde, "tail -f" çalışmaya devam edeceği için sıkıştı. Bu komut dosyasını günlükleri sıraya koymak ve daha sonra bir test senaryosu çalıştırmak için kullanıyorum. Test senaryosu yürütmesi tamamlandıktan sonra, depo kuyruğunun depolandığı yerden okuyan ve kuyruğu öldüren başka bir komut dosyası çalıştırıyorum. Anlayışımda yanılsam ve ayrıca daha iyi bir çözüm varsa lütfen bana bildirin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.