web-dev-qa-db-ja.com

ssh中にエラーが発生したかどうかを確認するにはどうすればよいですか?

デプロイメントスクリプトを作成していますが、エラーが発生した場合はロールバックする必要があります。

例えば:

#!/bin/bash
ssh myapp '
    mkdir /some/dir
    # check if above command failed, and execute rollback script if needed
'
# or maybe do it from here?

現在、このスクリプトを実行すると、mkdirが失敗すると、画面に出力されて実行が続行されます。私はそのエラーを見つけて、それについて何かをする必要があります。

8
ChocoDeveloper

sshの終了ステータスは、リモートコマンドの終了ステータスになります。例えば

ssh myapp 'exit 42'
echo $?

42を出力する必要があります($?は、最後に実行されたコマンドの終了ステータスです)。

1つのオプションは、mkdirが失敗した場合にすぐに終了することです。

ssh myapp 'mkdir /some/dir || exit 42; do-more-stuff'
if [[ $? = 1 ]]; then
   echo "Remote mkdir failed"
fi

可能であれば、スクリプト内のリモート障害を処理することをお勧めします。

6
chepner

エラーメッセージを本当にキャッチする必要がある場合は、これを試すことができます:

#!/bin/bash
result=`ssh myapp 'mkdir /some/dir' 2>&1`
if [[ -n $result ]]; then
    echo "the following error occurred: $result"
fi

これにより、標準エラー出力を標準出力にリダイレクトし、sshコマンドの出力を$resultに保存します。エラーコード/終了ステータスだけが必要な場合は、 この回答 を参照してください。

5
speakr