HTTPSを介してWebサーバーから特定のファイルをダウンロードできないように、ネットワークファイアウォールによって断続的に(ランダムに)ブロックされるFreeBSDサーバーのいくつかの問題を解決しようとしています。ブロックが発生した場合に何が起こるかを理解するには、次のcURLを実行する必要があります。
curl --interface nic1 --verbose --insecure 'https://speed.hetzner.de/100MB.bin' > /dev/null
次に、コマンドのstderrを読みます。しかし、問題は予期しないランダムな時間に発生するので、このカールを10秒ごとに実行し、stderrをファイルに保存して後で表示できるようにしたいと思います。cURLScript
これを達成するには、次のスクリプト(名前)を使用します。
#!/bin/sh
while true
do
date
echo "================================="
curl --interface nic1 --verbose --insecure 'https://speed.hetzner.de/100MB.bin' > /dev/null 2>&1
echo ""
sleep 10
done
次にスクリプトを実行します。
/bin/sh cURLScript > log &
log
ファイルにstderrが含まれると予想しましたが、log
stderrはありません。
Svr12loc:service 21] cat log
Thu Mar 24 16:42:34 CET 2022
=================================
Thu Mar 24 16:43:03 CET 2022
=================================
Thu Mar 24 16:43:33 CET 2022
=================================
Thu Mar 24 16:44:02 CET 2022
=================================
Thu Mar 24 16:44:32 CET 2022
=================================
Thu Mar 24 16:45:00 CET 2022
=================================
誰もが私がここで何を間違っているかを提案できますか?
ベストアンサー1
あなたの質問は不明です。私 推測するはい、意味
- (に送信したい
HTMLFILE
)cURLのHTML出力には興味がありません。 - あなたは「詳細な」メッセージに興味があります。
- 詳細メッセージは(ファイルの代わりに)端末に送信されます
Log
。 Log
端末ではなくファイルに移動したいです。
Unix(およびUnixのようなオペレーティングシステム、さらには他のいくつかのオペレーティングシステム)では、プログラムには2つの自動出力ストリームがあります。標準出力(略語「stdout」)と標準エラー(略語「stderr」)です。名前が示すように、stdoutはデフォルト出力に使用され、stderrはエラーメッセージと診断に使用されます。デフォルトでは、両方とも端末を指します。と言うと、> HTMLFILE
cURLの標準出力をにリダイレクトしますHTMLFILE
。ただし、詳細メッセージはstderrに記録されます。
必要なのは、cURLのstderrをスクリプトのstdout(ファイルLog
)に送信することです。
これは、Bourneシェルから派生したすべての標準POSIX準拠シェルで簡単です。
#!/bin/sh 本当ではありますが する 日付 エコ「====================================」 カール --インターフェイス nic1 --verbose --insecure https://www.20min.ch 2>&1 > HTMLページ エコ「」 睡眠10 完璧
2>&1
上記とまったく同じです。 stderrをstdoutにリダイレクトします。
Cシェルではもっとトリッキーです。
#!/bin/csh t=`mktemp` に設定 そして((1)) 日付 エコ「====================================」 (カール --インターフェイス nic1 --verbose --insecure https://www.20min.ch > HTMLPAGE) >&"$t" 猫「$t」 エコ「」 睡眠10 終わり
cshでは、>&
stdoutとstderrを次のファイルに送信することを意味します。好きなように別の場所に送るのは難しいです。秘密は、stdoutを目的の場所に送信し、次のコマンドを括弧で囲み、ラップされた>&
コマンドに使用することです。標準エラーを標準出力に送信する方法がわかりません。 (おそらく方法があり、それが何であるかを知らせると思います。)上記では、stderrを一時ファイルに送信した後 cat
。
標準シェルからスクリプトを作成することをお勧めします。 Cシェルはスクリプトには適していません。
PS:カールの標準出力を保存したくない場合に送信するにはどうですか/dev/null
?