Ich habe ein Skript, das gut funktioniert, wenn ich auf dem Server ssh ausführe, um es selbst auszuführen, aber es hat Probleme, wenn Hudson , ein Continuous Integration Server, es ausführt .
Ich automatisiere Tests auf einem eingebetteten Linux-System (dem Ziel). Das Target ist seriell mit Server A (RHEL 5) verbunden und wird über minicom bedient. Server B (FC 12) erstellt die Tests, die tatsächlich auf dem Ziel ausgeführt werden, und kann an Server A senden. Server C (RH) hostet Hudson, wobei Server B als Slave fungiert.
Ich habe ein RunScript-Skript (http://linux.die.net/man/1/runscript) geschrieben, mit dem ich alles tun kann, was für das eigentliche Ziel erforderlich ist. Es bootet das Image, stellt ein Verzeichnis von Server B bereit und führt die Tests durch. Ein Bash-Skript auf Server B ruft minicom mit dem RunScript-Skript zusammen mit einigen Begleitaktionen auf. Ich habe ein Bash-Skript auf Server B, das verwendet
ssh -t -t ServerA bashScript.sh
um diese Tests auf dem Ziel auszuführen. Ich bin auf Server C und kann diese Tests ausführen, indem ich auf Server B ssh'ing und das Skript von ssh auf Server A ausführe, das minicom mit runScript ausführt. Wütend. Zur Überprüfung:
Server A: Hudson verwendet seinen Slave-Mechanismus, um zu Server B zu sshen.
Server B: kickOffTests.sh
hat die Leitungssh -t -t ServerA runTests.sh
Server A: runTests.sh
ruft ein Perl-Skript auf, das aufruftminicom -S my.script ttyE1
Ziel nach dem Booten: Hängt ein Verzeichnis von Server B an, in dem sich die Tests befinden, und gibt dieses Verzeichnis ein. Es ruft ein weiteres Bash-Skript auf, das die Tests ausführt, bei denen es sich um kompilierte ausführbare C-Dateien handelt.
Wenn ich jetzt eines dieser Skripte selbst ausführe, tun sie, was sie sollen. Wenn Hudson jedoch versucht, dasselbe zu tun, beklagt er sich in der Minicom-Sitzung über eine Zeile im "Noch ein Bash-Skript", das die ausführbare C-Datei " ./executable
, with " aufruft./executable: cannot execute binary file
Ich muss noch viel über Linux lernen, aber ich gehe davon aus, dass dieses Problem darauf zurückzuführen ist, dass Hudson keine Verbindung zu einer Konsole herstellt. Ich weiß nicht genau, was Hudson tut, um seinen Sklaven zu kontrollieren. Ich habe versucht, die Zeile export TERM=console
in der Konfiguration zu verwenden, bevor kickOffTests.sh ausgeführt wurde, aber das Problem bleibt bestehen.
Kann mir jemand erklären, was passiert und wie ich das beheben kann? Ich kann keinen der Server aus dieser Gleichung entfernen. Es könnte möglich sein, Minicom aus der Gleichung herauszunehmen, aber das würde diesem Projekt eine unbekannte Zeitspanne hinzufügen, daher würde ich eine Lösung vorziehen, die das nutzt, was ich bereits habe.
quelle
Dies kann passieren, wenn Sie die Shebang-Zeile oben in Ihrem Skript verpassen. Stellen Sie sicher, dass das Skript mit Folgendem beginnt:
Dies zeigte sich nur für mich, als ich das Skript mit ausgeführt habe
sudo -u <user>
quelle