ゼロ以外の値で終了しないようにしてください


0

私の本当の目標は、リモートサーバーにSSH接続してTomcatを再起動して使用するスクリプトをローカルで実行することです。 expect 「Server startup in」メッセージを待つか、起動に失敗したことがわかった場合はゼロ以外の値で終了します。私の試みはこのスクリプトです。私はデバッグにlocalhostを使用していますが、「起動に失敗しました」ではなくINFOを使用して人為的に終了させます。

ssh -T localhost <<SSH_EOF
docker restart app
expect <<EXPECT_EOF
set timeout 30
spawn docker logs --since 1s -f app
expect_before "INFO" { exit 1 }
expect "Server startup in"
EXPECT_EOF
if [[ $? -eq 0]]; then
    echo "Success!"
else
    echo "Failed!"
fi
SSH_EOF

スクリプトは最初のINFOメッセージで終了しますが、Successと表示されます。なぜ1で終了しないのでしょうか。


つかいます expect -d 詳細ログを表示するには、最初に表示される "INFO"または "Server startup in"のいずれかです。
glenn jackman

私は試してみました -d フラグが、それはまだ素晴らしいヒントです。 INFOは間違いなく最初に見られます。出力の一番最初の行は 26-Jan-2019 17:51:32.070 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name: Apache Tomcat/9.0.14 すぐに終了すると期待して $? すでに '0'に解決されています(受け入れられた回答を参照)。
Dave

回答:


2

あなたが使っている << を含める こちらの資料 これは パラメータに従う 展開、コマンド置換、および算術展開 。特に、 $? sshに渡される前でさえ(おそらく)0に置き換えられます。

これを回避するには、ヒア区切り文字を引用符で囲む必要があります。 <<'SSH_EOF'。実際の区切り文字はまだ SSH_EOF。あなたはおそらく同じことを期待のためにするべきです EXPECT_EOF関連する将来の変更の場合 $


ブリリアント。引用符を追加することは完全にうまくいきました。ありがとうございます。
Dave
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.