
私は、特殊なメモリ処理を使用する古い 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
適切なディレクトリに移動する必要があります。絶対パスを指定する以外の正しい方法は次のとおりです。
もう 1 つの便利な注意点は、.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
コードのafter 行の後には何もありません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
あなたのものには がありません。