リモートマシンでコードを実行し、結果をコピーして戻す

リモートマシンでコードを実行し、結果をコピーして戻す

私は、特殊なメモリ処理を使用する古い 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あなたのものには がありません。

関連情報