私は特別なメモリ処理を使用する古い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
あなたのものは消えた。