
私は 4 台の Raspberry Pie を持っていて、すべて curl 7.64.0 を実行しています。各 Pi は 2 分ごとに同じホストにウェブカメラ画像をアップロードします。つまり、4 台の Pi で 1 時間あたり 30 枚の画像になります。これはすべて、単純な bash シェル スクリプトで行われます。ホストとの認証は公開キーで行われます。
通常、これは正常に動作しますが、時々、すべてまたはほとんどの Pie が curl エラー 2 で失敗します。ログによると、これは「ssh セッションの確立に失敗しました: -13、バナーの取得に失敗しました」が原因です。
これは curl のエラーが原因ではないことは理解していますが、curl でエラーを克服できる方法があるのか疑問に思っています。
現在、次のパラメータを使用しています。
--connect-timeout 10 --max-time 120 --retry 5 画像は 2 分ごとにアップロードされるため、max-time を 120 に設定しました。他の 2 つは、うまくいくかどうかの推測にすぎません。
完全な curl コマンドは次のとおりです。
curl -s -v -u me: \
--connect-timeout 10 \
--max-time 120 \
--retry 5 \
--pubkey ~/.ssh/id_rsa.pub \
-T $file $host >> $log 2>&1
どこ:
$file is: the file to be uploaded
$host is: host=sftp://ftp.me.com/~/public_html/
$log is: the local log file
詳細な curl 出力は次のとおりです。
* Trying nnn.nnn.nnn.nnn...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x3698b0)
* Connected to ftp.mgnewman.com (nnn.nnn.nnn.nnn) port 22 (#0)
* Failure establishing ssh session: -13, Failed getting banner
* Closing connection 0
もっと良い方法はあるでしょうか?
答え1
これは質問に対する答えとしては大したものではないですが、問題の解決策の 1 つです。curl コマンドを do ループで囲みました。curl は「バナーの取得に失敗しました」というエラーを接続エラーとは見なさないため、「再試行」は行われず、タイムアウトするだけであるようです。私が使用しているのは次のとおりです。
for i in {1..3}
do
curl -s -v -u mgnewman: \
--connect-timeout 25 \
--max-time 40 \
--retry 3 \
--pubkey ~/.ssh/id_rsa.pub \
-T $file $host >> $log 2>&1
err=$?
echo $'\n'"`date`" Upload Ended "$err" - $(hostname) >> "$log"
if [ $err -eq 0 ] ; then
break
fi
done
醜いですが、4 つの Pie のいずれにも curl 2 エラーはなくなりました。