リモートコンピュータでコードを実行し、結果を再度コピーします。

リモートコンピュータでコードを実行し、結果を再度コピーします。

私は特別なメモリ処理を使用する古いFortranコードで作業しています。簡単に言えば、私のローカルコンピュータでは動作しますが、リモートコンピュータでは失敗します。これがsshローカルコンピュータでコードを実行し、計算を実行しているクラスタに結果を再コピーする理由です。

このフォーラムで同じ問題を見つけました。

編集#1

@Anthonのコメント後にスクリプトを修正しましたが、残念ながら新しいエラーが発生しました。メモ:SSHキーを使用しているため、パスワードは不要です。

私の新しいスクリプト:
#! /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"

私の問題は、run.sh基本スクリプトが別のシェルスクリプトを呼び出して正しく実行されないことです。次のメッセージを受け取りました。

/home/run_dir_script/run.sh: 行 59: /home/run_dir_script/merge_tabs.sh: そのファイルやディレクトリはありません。

最小限の例:

ここに私がしていることの要約例があります。

はいrun.sh

#! /usr/bin/bash

pwd
echo "Run the code"
./HELLO_WORLD

上記のスクリプトは次のように生成されます。

ssh usr@machene_wehere_i_run_the_code /home/run_dir_script/run.sh    

完全性のために Fortran コード ./HELLO_WORLD

program main
write(*,*) 'Hello World'
stop
end

gfortran -o HELLO_WORLD hello_world.F90 を使用してコンパイルします。

これが出力です

/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

したがって、コードを直接呼び出すだけです。スクリプト経由で呼び出すと失敗します。

考えられる解決策:

失敗の理由は、sshの後にリモートシステムにログインしたためです$HOME

したがって、スクリプトを実行する前にcd正しいディレクトリに移動する必要があります。絶対パスを提供することに加えて、正しい方法は次のとおりです。

別の有用な注意点は、.bashrcのすべての変数が定義されていないことです。したがって、人々は注意する必要があります。

 usr@machene_wehere_i_run_the_code "cd /home/run_dir_script ; run.sh"

それでは、ある程度効果があるでしょう。

答え1

sshパラメータを二重引用符で囲みましょう。

ssh usr@machene_wehere_i_run_the_code "/home/run_dir_script/run.sh inp 8"

また、そのエラーメッセージによれば、スクリプトが次のスクリプトを見つけることができないようです。

/home/run_dir_script/run.sh: 行 59: /home/run_dir_script/merge_tabs.sh: そのファイルやディレクトリはありません。

scpまた、成功ステータスが返されない場合でもsshこれが発生しないようにします。

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

しかし、最も重要な問題は、スクリプトがリモートシステムでスレーブスクリプトを見つけるのに問題があることです。ログインしてスクリプトを実行するときにログインしてsshスクリプトを実行するときと比較して、いくつかの変数を設定できます。

envこれを行うには、両方の方法を使用して出力を比較しましょう。

答え2

ssh -X usr@machene_wehere_i_run_the_codeコードの次の行には何もありません。したがって、このコマンドはmachene_wehere_i_run_the_codeログイン後は何もしません。

引用した質問に対する回答のssh呼び出しの例には、追加のパラメータがあります。

ssh user@host path_to_script

そしてpath_to_scriptあなたのものは消えた。

関連情報