
リモートコンピュータでいくつかの計算を実行しようとしています。基本的に、いくつかのファイルをコンピュータにコピーし、ソフトウェアをロードし、計算を実行し、データを取得したいと思います。そのためにパスワードのない接続を作成しました。私が試したことは次のとおりです。
#!/bin/bash
scp ./* username@host:/home/tmp
work=$pwd
ssh username@host
cd /home/tmp
module purge
module load gcc/4.6.0 icc/11.1.075 ifort/11.1.075 compilers-extra mpi-openmpi/1.4.3-icc-11.1 vasp
mpirun -np 20 vasp > out.vasp 2>&1 &
scp ./* username@headnode:$work
スクリプトはファイルをコピーしてリモートシステムにログインするだけで、計算を開始しません。
答え1
あなたの問題が何であるかよくわかりませんが、私の意見の2つが長すぎます。
ログインするとすぐ
host
(ライン4)現在のスクリプトが停止し、対話的にいくつかの操作が行われるのを待ちます。ログアウトするときにのみスクリプトが続行されます(おそらく望むものではないかもしれません)。したがって、リモートサーバーで実行したいすべてをスタンドアロンシェルスクリプトに入れ、残りのデータと一緒にscpしてください
ssh username@host /path/to/my/script
。したがって:
#!/bin/bash
# your local script
scp ./inputs* ./do_stuff.sh username@host:/home/tmp
ssh username@host /home/tmp/do_stuff.sh
scp username@host:/home/tmp/outputs* .
#!/bin/bash
# script for remote execution do_stuff.sh
cd /home/tmp
module purge
module load gcc/4.6.0 icc/11.1.075 ifort/11.1.075 compilers-extra mpi-openmpi/1.4.3-icc-11.1 vasp
mpirun -np 20 vasp > out.vasp 2>&1
inputs*
/をクラスターまたはクラスターからコピーする必要がある項目に置き換えますoutputs*
。おそらく入力をコピーしたくないでしょう。以下を参照するスクリプトはdo_stuff.sh
実行可能としてマークする必要があります。それでも機能しない場合(コピーするファイルシステムがそのオプションnoexec
でマウントされているため)、次のように使用しますssh username@host bash /home/tmp/do_stuff.sh
。またはリモートシステムにパイプすることもできます。
cat do_stuff.sh | ssh username@host bash -
2)このプログラムを実行している場合(表示されているように見える)、headnode
プログラムを再実行して1方向のscp接続を削除できます。scp
headnode
答え2
リモート実行のためにスクリプトを自宅に保管してから、スクリプトを呼び出すことをお勧めします。
ssh user@host 'bash -s' < local_script.sh
デフォルトでは、パスワードなしでアクセスできるスクリプトでは、それ以降はssh username@host
実行されません。これはテストが簡単です。
テスト
これらの2行をスクリプトに入れて、ローカルコンピュータでスクリプトを実行してみてください。
ssh username@host
hostname
通常、SSH経由で接続したため、リモートコンピュータ名が印刷されると予想されます。しかしそれは真実ではない。リモートシステムにログインしてexit
リモートシステムからログアウトするときのホスト名(印刷されるホスト名を確認してください。ローカルコンピュータのホスト名が印刷されます。)。
今私が提案したように、あなたの家にスクリプトがあり、名前を付けると
ssh user@host 'bash -s' < local_script.sh
この例の出力はリモートホスト名(今は役に立たないので、スクリプトからssh行を削除してください。)。
答え3
デフォルトでは、スクリプトはリモートシステムで続行したいが、そのようなことは起こらず、ローカルシステムで実行されます。目的を達成するには、SSHを介して一連のコマンドをリモートシステムに渡す必要があります。
このガイドを読んでアイデアを得ることができます。http://www.shellhacks.com/en/Running-Commands-on-a-Remote-Linux-Server-over-SSH