対話型 bash シェルで次のコマンドを実行する場合:
$ curl ipinfo.io/ip
123.45.67.890
私が作成した場合/etc/cron.d/myjob
:
24 * * * * tim ( date && curl ipinfo.io/ip && date ) > /tmp/cron.log 2>&1
/tmp/cron.log でカールから次の監視情報を取得します。
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
^M 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0^M100 14 100 14 0 0 147 0 --:--:-- --:--:-- --:--:-- 148
123.45.67.890
場合によってはカールから監視情報を取得できますが、他の場合は取得できないのはなぜですか? 2つの状況は何ですか?ありがとうございます。
答え1
違いは、最初のケースでは端末に書き込むことです。curl
マンページスケジュールを明かしました。
デフォルトでは、カールはこのデータを端末に表示するので、カールを呼び出して動作し、端末にデータを書き込もうとすると障害を負うプログレスメーター、そうでなければ出力ミキシングプログレスメーターと応答データが混乱します。
進行状況インジケータが無効になっていない場合は、curl
stderrに出力し、ダウンロードしたデータをstdinに出力します。 cronジョブでは、両方ともターミナルではなく両方にリダイレクトされるため、両方が/tmp/cron.log
ログファイルに表示されます。
curl
この動作は、一般的な使用シナリオで「うまく機能する」ためです。最初の例のようにを使用してcurl
データを検索して端末に出力すると、表示されるのはデータだけです。データを検索してファイルまたはパイプに出力する場合、curl
端末に進捗情報が表示されます。
cronジョブでは、2つを二重リダイレクトに混在させます/tmp/cron.log
。混合出力を表示したくない場合は、この-s
オプションを使用して進行状況インジケータを完全に無効にしたり、標準エラーを別のファイルにリダイレクトしたりできます。
24 * * * * tim ( date && curl -s ipinfo.io/ip && date ) > /tmp/cron.log 2>&1
または
24 * * * * tim ( date && curl ipinfo.io/ip && date ) > /tmp/cron.log 2>/tmp/cron.err