SSHで長期実行スクリプトを起動し、すぐに返したいと思います。その後、5分ごとにリモートホストを確認して、ジョブが完了したことを確認したいと思います。
最初の部分を完了するために、以下を使用しました。このトリック:
ssh root@remoteserver 'TMP_FILE=$(mktemp --tmpdir backup.XXXXXXXXXX.log) && (/root/backup.sh </dev/null > $TMP_FILE 2>&1 &) && echo $TMP_FILE'
DONE_$TMP_FILE
2番目の部分では、backup.shが任意のスクリプトである可能性があるため、backup.shが終了したときに指すファイルに次の内容を追加し、$TMP_FILE
5分ごとにこのコマンドを実行しようとしています。
ssh root@remoteserver 'tail -1 $TMP_FILE'
最後の行が同じであることを確認してくださいDONE_$TMP_FILE
。
問題は、複合コマンドから抜け出すことができないことです。
ssh root@remoteserver 'TMP_FILE=$(mktemp --tmpdir backup.XXXXXXXXXX.log) && (/root/backup.sh </dev/null > $TMP_FILE 2>&1 && echo DONE_$TMP_FILE >> $TMP_FILE &) && echo $TMP_FILE'
上記のコマンドは、backup.sh
実行が完了するまで単にブロックされます。
ラッパーシェルスクリプトに入れずに一連のコマンドを分離する方法はありますか?
もっと良い方法があれば聞きたいです。理想的には、ヘルパーシェルスクリプトを作成する必要はありません。
答え1
解決策は思ったより簡単でした。
ssh root@remoteserver 'TMP_FILE=$(mktemp --tmpdir backup.XXXXXXXXXX.log) && ((/root/backup.sh && echo DONE_$TMP_FILE) </dev/null > $TMP_FILE 2>&1 &) && echo $TMP_FILE'