./executable: ikili dosya yürütülemiyor


12

Kendime yürütmek için sunucuya ssh zaman iyi çalışan bir komut dosyası var, ancak Hudson , sürekli bir entegrasyon sunucusu çalıştırdığında sorunları var.

Gömülü bir linux sisteminde (hedef) testleri otomatikleştiriyorum. Hedef seri olarak Sunucu A'ya (RHEL 5) bağlanır ve minicom üzerinden çalıştırılır. Sunucu B (FC 12), aslında hedefte çalışan testleri oluşturur ve Sunucu A'ya ssh yapabilir. Sunucu C (RH), Sunucu B ile köle olarak Sunucu'yu barındırır.

Gerçek hedefe ihtiyaç duyulan her şeyi yapmak için bir runscript (http://linux.die.net/man/1/runscript) betiği yazdım; görüntüyü önyükler, Sunucu B'den bir dizin bağlar ve testleri yürütür. Sunucu B'deki bir bash betiği, bazı tamamlayıcı eylemlerle birlikte minicom'u runscript betiğiyle çağırır. Kullanan Sunucu B bir bash betiği var

ssh -t -t ServerA bashScript.sh

bu testleri hedefe yöneltmek için. Sunucu C'dayım, bu testleri Sunucu B'ye ssh'ing yaparak ve sunucu ssh ile minicom yürüten Sunucu A'ya ssh komut dosyasını çalıştırarak alabilirim. Whew. İncelemek için:

A Sunucusu: Hudson, B Sunucusuna ssh için köle mekanizmasını kullanır.

Sunucu B: kickOffTests.shsatırı varssh -t -t ServerA runTests.sh

Sunucu A: runTests.shçağıran bir perl betiğini çağırırminicom -S my.script ttyE1

Önyükleme sonrasında hedef: Sunucu B'den sınamaların olduğu bir dizini bağlar ve bu dizine girer. C çalıştırılabilir derlenen testleri çalıştıran başka bir bash betiğini çağırır.

Şimdi, ne zaman ben Bu senaryoların herhangi kendim yürütmek, ne olması gerektiği yapmak. Ancak, Hudson aynı şeyi yapmaya çalıştığında, minicom oturumunda, C çalıştırılabilirini çağıran "yine başka bir bash betiği" ndeki bir satırdan şikayet ./executableediyor../executable: cannot execute binary file

Linux hakkında öğrenecek çok şeyim var, ancak bu sorunun Hudson'ın bir konsola bağlanmamasının bir sonucu olduğunu düşünüyorum. Hudson'ın kölesini kontrol etmek için ne yaptığını tam olarak bilmiyorum. Ben export TERM=consolekickOffTests.sh çalıştırmadan hemen önce yapılandırmada hattı kullanarak çalıştı , ama sorun devam ediyor.

Biri bana neler olduğunu ve bunu nasıl düzeltebileceğimi açıklayabilir mi? Bu denklemdeki sunucuların hiçbirini kaldıramıyorum. Minicom'u denklemden çıkarmak mümkün olabilir, ancak bu projeye bilinmeyen bir süre ekleyecektir, bu yüzden zaten sahip olduğum şeyi kullanan bir çözümü tercih ederim.

Yanıtlar:


13

Mesajın cannot execute binary fileterminallerle ilgisi yok (bunu düşünmenize neden olan şeyi merak ediyorum - ve bir soruda bu varsayımları yapmaktan kaçınmanızı öneriyorum, çünkü bunlar gerçek sorununuzu kırmızı ringaların bir karmaşasında boğulma eğilimindedir). Aslında, bash'ın ifade etme şekli ENOEXEC(daha yaygın olarak ifade edilir exec format error.

Öncelikle, bu yürütülebilir dosyayı komut dosyası olarak çalıştırmayı denemediğinizden emin olun. Yazdığın olursa . ./executable, bu yürütmeye bash söyler ./executable(ayrı bir süreç aksine) çağıran komut dosyasıyla aynı ortamda. Dosya bir komut dosyası değilse bu yapılamaz.

Aksi takdirde, bu ileti ./executable, çekirdeğin tanıdığı bir biçimde olmadığı anlamına gelir . Gerçi ne olduğuna dair kesin bir tahminim yok. Komut dosyasını aynı makinede farklı bir şekilde çağırarak çalıştırabilirseniz, sadece bozuk bir dosya veya yanlış mimari için bir dosya olamaz (bu olabilir, ancak daha fazlası vardır). Acaba hedefin çizilmesinde bir fark olabilir mi (belki bir yarış durumu).

İşte size yardımcı olabilecek ek verilerin bir listesi:

  • file …/executableSunucu B'nin çıkışı .
  • Hedefle ilgili uname -aunix benzeri olup olmadığı gibi bazı bilgiler .
  • Her seferinde hedefin aynı dosya içeriğini görüp görmediğini kontrol edin: cksum ./executableveya md5sum ./executablebaşka bir bash-script çağrılmadan hemen önce hedefte veya çalıştırdığınız yöntem ./executable. Sonuçların Hudson çağrısında, başarılı manuel çağrınızda ve B sunucusunda aynı olup olmadığını kontrol edin.
  • set -xBaşka bir bash betiğinin en üstüne ekleyin ( #!/bin/bashsatırın hemen altında ). Bu, betiğin yaptığı her şeyin izini oluşturur. İzleri karşılaştırın ve herhangi bir fark veya tuhaflığı bildirin.
  • Komut dosyalarını manuel olarak çalıştırdığınızda ve Hudson dahil olduğunda hedefin nasıl önyüklendiğini açıklayın. Hedef farklı şekilde önyüklenebilir ve ./executableHudson çağrılarına format desteği veren bazı yüklenebilir modüller yüklenmez (veya henüz yüklenmez). set -xOraya yardım etmek ve önyükleme günlüklerini hedeften incelemek için diğer komut dosyalarında kullanmak isteyebilirsiniz .

Komut dosyası ". .Exexutable" içeriyorsa, komut dosyası nasıl çağrılırsa kullanılsın bu sorunla karşılaşmaz mıydım? "./KickOffTests.sh" dosyasını çağırdığımda, hedefte "./executable" çağrılmadan önce birkaç komut dosyası katmanı var. Soruda varsayımlarda bulunmamam konusunda haklısın, ama farklı olan tek şey ebeveyn komut dosyasının nasıl çağrıldığı, bir yolun açık bir ssh terminalinde ve diğerinin otomatik olarak Hudson olduğu, cevap bu farkın içinde.
jasper77

@ jasper77: Şimdi hata mesajının başlangıçta düşündüğüm anlamına gelmediğini anlıyorum (ancak sorununuz terminallerle ilgili ise, bağlantı çok dolaylıdır). Düzeltilmiş cevabımı görün ve önerilen ek verileri olabildiğince sağlamaya çalışın.
Gilles 'SO- kötü olmayı kes

Ben komut olduğunu başkalarının yararına karşı karşıya kırmızı itiraf değil diye düşündüm tam olarak ne yapıyor. Gilles çivilenmişti; yürütülebilir dosyalar farklı bir hedef için oluşturulmuştu. Bir komut dosyasının "make -C" satırında, bir hedef ad bırakmıştım, bu yüzden varsayılan hedef istediğim yerine oluşturuldu. Bunu düzelttiğimde, Hudson minicom oturumunu başarıyla sürdürebilir. Ben ssh çalışan bir konsol uygulaması ile ilgili sorunlar yaşıyorsanız ve 'ihracat TERM = konsol' ve "ssh -t -t" yol boyunca öğrendim beri, sorunlarım vardı ikna oldu. Teşekkürler Gilles!
jasper77

0

Senaryonuzun üst kısmındaki shebang satırını kaçırıyorsanız bu olabilir. Komut dosyasının şunlarla başladığından emin olun:

#!/bin/bash

Bu sadece benim için senaryoyu çalıştırdığımda ortaya çıktı sudo -u <user>

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.