場合によってはカールから監視情報を取得できますが、他の場合は取得できないのはなぜですか?

場合によってはカールから監視情報を取得できますが、他の場合は取得できないのはなぜですか?

対話型 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マンページスケジュールを明かしました。

デフォルトでは、カールはこのデータを端末に表示するので、カールを呼び出して動作し、端末にデータを書き込もうとすると障害を負うプログレスメーター、そうでなければ出力ミキシングプログレスメーターと応答データが混乱します。

進行状況インジケータが無効になっていない場合は、curlstderrに出力し、ダウンロードしたデータを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

おすすめ記事