
Ich verwende alten Fortran-Code, der eine eigenartige Speicherverwaltung verwendet. Um es kurz zu machen: Er läuft auf meinem lokalen Rechner, schlägt aber auf dem Remote-Rechner fehl. Deshalb möchte ich ssh
den Code auf meinem lokalen Rechner ausführen und die Ergebnisse zurück auf den Cluster kopieren, auf dem ich meine Berechnungen durchführe.
Ich habe genau die gleiche Frage bereits in diesem Forum gefunden:
BEARBEITEN #1
Nach dem Kommentar von @Anthon habe ich mein Skript korrigiert, leider ist ein neuer Fehler aufgetreten.NOTIZ:Ich verwende SSH-Schlüssel, daher sind keine Passwörter erforderlich.
Mein neues Skript:#! /bin/bash
# start form the machine_where_the_resutlst_are_needed
ssh usr@machene_wehere_i_run_the_code /home/run_dir_script/run.sh inp 8
# do the work by running a script. 8 jobs are run by sending them
# to the background,
scp -p usr@machene_wehere_i_run_the_code:/home/run_dir_script/results \
user@machine_where_the_resutlst_are_needed:~/
echo "I am back"
Mein Problem ist, dass run.sh
ein Masterskript andere Shellskripte aufruft und diese nicht richtig ausgeführt werden. Ich erhalte die folgende Meldung:
/home/run_dir_script/run.sh: Zeile 59: /home/run_dir_script/merge_tabs.sh: Keine solche Datei oder kein solches Verzeichnis
Minimales Beispiel:
Hier ist ein komprimiertes Beispiel dessen, was ich mache
Beispielrun.sh
#! /usr/bin/bash
pwd
echo "Run the code"
./HELLO_WORLD
Das obige Skript wird ausgeführt von
ssh usr@machene_wehere_i_run_the_code /home/run_dir_script/run.sh
Der Vollständigkeit halber der Fortran-Code ./HELLO_WORLD
program main
write(*,*) 'Hello World'
stop
end
Kompilieren mit gfortran -o HELLO_WORLD hello_world.F90
Und hier ist die Ausgabe
/home/run_dir_script/
Run the code
/home/run_dir_script/test.sh: line 5: ./home/HELLO_WORLD: No such file or directory
Anmerkung:
The following will run `HELLO_WORLD` on the remote machine
ssh usr@machene_wehere_i_run_the_code /home/run_dir_script/HELLO_WORLD
Der direkte Aufruf des Codes funktioniert also einwandfrei. Der Aufruf über das Skript schlägt fehl.
Mögliche Lösung:
Der Grund, warum dies fehlschlägt, liegt darin, dass ich nach SSH im meines Remote-Computers lande $HOME
.
Daher muss ich vor der Ausführung des Skripts cd
in das richtige Verzeichnis wechseln. Die korrekte Methode, abgesehen von der Angabe des absoluten Pfads, ist:
Ein weiterer nützlicher Hinweis ist, dass alle Variablen in .bashrc undefiniert sind. Daher muss man vorsichtig sein.
usr@machene_wehere_i_run_the_code "cd /home/run_dir_script ; run.sh"
Also das funktioniert irgendwie
Antwort1
ssh
Ich würde versuchen, die Argumente in Anführungszeichen zu setzen .
ssh usr@machene_wehere_i_run_the_code "/home/run_dir_script/run.sh inp 8"
Basierend auf dieser Fehlermeldung klingt es außerdem so, als ob das Skript dieses Skript nicht finden kann:
/home/run_dir_script/run.sh: Zeile 59: /home/run_dir_script/merge_tabs.sh: Keine solche Datei oder kein solches Verzeichnis
Außerdem würde ich dies blockieren, scp
wenn ssh
kein erfolgreicher Status zurückgegeben wird:
ssh usr@machene_wehere_i_run_the_code "/home/run_dir_script/run.sh inp 8"
status=$?
if $status; then
scp -p usr@machene_wehere_i_run_the_code:/home/run_dir_script/results \
user@machine_where_the_resutlst_are_needed:~/
fi
Das Problem besteht jedoch darin, dass Ihr Skript die untergeordneten Skripte auf dem Remote-System nicht findet. Möglicherweise werden Variablen festgelegt, wenn Sie sich anmelden und Ihr Skript ausführen, im Gegensatz zu der Zeit, wenn Sie sich über anmelden ssh
und Ihr Skript ausführen.
Hierzu würde ich die Ergebnisse env
beider Methoden vergleichen.
Antwort2
In Ihrem Code folgt in der Zeile danach nichts ssh -X usr@machene_wehere_i_run_the_code
. Der Befehl meldet sich also an machene_wehere_i_run_the_code
und tut nichts.
Im Beispiel-SSH-Aufruf in der akzeptierten Antwort auf die von Ihnen zitierte Frage gibt es einen zusätzlichen Parameter:
ssh user@host path_to_script
und das path_to_script
fehlt bei Dir.