Führen Sie den Code auf dem Remotecomputer aus und kopieren Sie die Ergebnisse zurück

Führen Sie den Code auf dem Remotecomputer aus und kopieren Sie die Ergebnisse zurück

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 sshden 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.shein 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 cdin 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

sshIch 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, scpwenn sshkein 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 sshund Ihr Skript ausführen.

Hierzu würde ich die Ergebnisse envbeider 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_codeund 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_scriptfehlt bei Dir.

verwandte Informationen