J'utilise un vieux code Fortran qui utilise une certaine manipulation de la memory. Pour faire la longue histoire, il fonctionne sur ma machine locale mais échoue sur la télécommand. C'est la raison pour laquelle je voudrais ssh
à mon ordinateur local pour exécuter le code et copyr les résultats dans le cluster sur lequel mes calculs sont exécutés.
J'ai déjà trouvé exactement la même question sur ce forum:
Après le commentaire de @Anthon, j'ai corrigé mon script, malheureusement une nouvelle erreur s'est produite. REMARQUE: j'utilise des keys ssh, donc aucun mot de passe n'est nécessaire.
Mon nouveau script:
#! /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"
Mon problème est que run.sh
est un script maître appelant d'autres scripts shell, et ils ne s'exécutent pas correctement. Je reçois le message suivant:
/home/run_dir_script/run.sh: line 59: /home/run_dir_script/merge_tabs.sh: Aucun file ou directory
Voici un exemple condensé de ce que je fais
run.sh
#! /usr/bin/bash pwd echo "Run the code" ./HELLO_WORLD
Le script ci-dessus est exécuté par
ssh usr@machene_wehere_i_run_the_code /home/run_dir_script/run.sh
Pour plus de détails, le code fortran ./HELLO_WORLD
program main write(*,*) 'Hello World' stop end
Comstackr avec gfortran -o HELLO_WORLD hello_world.F90
Et voici la sortie
/home/run_dir_script/ Run the code /home/run_dir_script/test.sh: line 5: ./home/HELLO_WORLD: No such file or directory
The following will run `HELLO_WORLD` on the remote machine ssh usr@machene_wehere_i_run_the_code /home/run_dir_script/HELLO_WORLD
Donc, appeler le code directement fonctionne bien. L'appeler via le script échoue.
La raison pour laquelle cela échoue est dû au fait que, après ssh je atterris dans $HOME
ma machine distante.
Par conséquent, avant d'exécuter le script, je dois cd
dans le directory approprié. La bonne méthode, en plus de donner le path absolu est:
Une autre remarque utile est que toutes les variables de .bashrc ne sont pas définies. Par conséquent, il faut être prudent.
usr@machene_wehere_i_run_the_code "cd /home/run_dir_script ; run.sh"
Donc cela fonctionne en quelque sorte
Il n'y a rien après sur la ligne après ssh -X usr@machene_wehere_i_run_the_code
dans votre code. Ainsi cette command se connecte sur machene_wehere_i_run_the_code
et ne fait rien.
Dans l'exemple de l'appel ssh dans la réponse acceptée de la question que vous citez, il y a un paramètre supplémentaire:
ssh user@host path_to_script
et le path_to_script
est manquant dans le vôtre.
Je voudrais essayer de mettre les arguments à ssh
entre guillemets.
ssh usr@machene_wehere_i_run_the_code "/home/run_dir_script/run.sh inp 8"
Aussi basé sur ce message d'erreur, il semble que le script ne peut pas find ce script:
/home/run_dir_script/run.sh: line 59: /home/run_dir_script/merge_tabs.sh: Aucun file ou directory
Aussi je bloquerais le scp
de se produire si le ssh
ne renvoie pas un statut réussi:
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
Le problème de fond est cependant qu'il y a un problème avec votre script localisant les scripts subordonnés sur le système distant. Il peut y avoir des variables qui sont définies lorsque vous vous connectez et exécutez votre script, par exemple lorsque vous vous connectez via ssh
et exécutez votre script.
Pour cela, je comparerais la sortie d' env
utilisant les deux methods.