Bash スクリプトを続行する前に、ssh によるスクリプトの実行が完了するまで待ちます。

Bash スクリプトを続行する前に、ssh によるスクリプトの実行が完了するまで待ちます。

次のスクリプトがあります。

command1
command2
ssh login@machine_with_lots_of_ram:~/script_that_needs_ram.sh
command4 output_file_from_above

コマンド 4 には ssh コマンドの出力が必要です。

続行する前に、sshスクリプトが完了するのを待つようにプログラムにどのように指示しますか?または、コマンド1の後にリモートシステムで実行するようにsshスクリプトを設定し、完了するまでプログラムがコマンド4を実行しないようにするにはどうすればよいですか。

答え1

リモートサーバーでコマンド(スクリプト)の実行が完了するまで、SSHセッションは終了しません。

スクリプトがデータをサーバー上のファイルに出力するのか標準出力に出力するのかに応じて、2つのうちの1つを実行できます。

  1. データをサーバー上のファイルに出力する場合:

    ssh user@host script.sh
    scp user@host:remote_output local_output
    process_output local_output
    

    これは、scpデフォルトでサーバーからローカルコンピュータにデータをコピーするために使用されます。

  2. データを標準出力として印刷する場合:

    ssh user@host script.sh >local_output
    process_output local_output
    

    これにより、スクリプトの標準出力がローカルファイルにリダイレクトされます。

インストーラが最初に実行され、待機します。

ssh user@host script.sh &

# do other stuff

wait
scp user@host:remote_output local_output
process_output local_output

または

ssh user@host script.sh >local_output &

# do other stuff

wait
process_output local_output

コマンド(バックグラウンドプロセスとして実行中)が終了するwaitまでスクリプトを一時停止します。ssh

答え2

リモートコマンドの出力をキャプチャする必要がある場合は、次のように動作します。

command1
command2
ssh login@machine_with_lots_of_ram "~/script_that_needs_ram.sh" > remote_output.log
command4 remote_output.log
# optionally:  rm remote_output.log

標準入力から入力を受け取ったら、command4次のこともできます。

ssh login@machine_with_lots_of_ram "~/script_that_needs_ram.sh" | command4

関連情報