ping cronジョブはcronスケジュールでは機能しませんが、コマンドラインでは機能します。

ping cronジョブはcronスケジュールでは機能しませんが、コマンドラインでは機能します。

私はこのクローンを予約しました:

0 * * * * ping -D -O -c 3492 8.8.8.8 | grep received > /home/user/.direc/packet_drops.txt

このコマンドは手動で実行すると正常に動作し、pingが完了した後に通常は.txtファイルにエクスポートされます。

cronで実行すると、ファイルは空になります。同じユーザー、同じ問題で手動コマンドとcronを試しました。

私は何を見逃していますか?また、エラー出力をリダイレクトしようとしましたが、まだ空です。

答え1

あなたの質問の説明で述べたように、ファイルを見るときにファイルが空になる可能性のある理由は、次に/home/user/.direc/packet_drops.txtcronジョブを実行したときにファイルが切り捨てられたためです。

パイプラインは操作が開始されるとすぐに設定され、リダイレクトは初期設定の一部として実行されます。ping毎時間起動して3492秒間実行されるため、切り捨てるpacket_drops.txt前に(理論的には)1時間あたり108秒の読み取りウィンドウしかありません。

長期実行ジョブが終了したときにのみログファイルを上書きする方法(コメント)は、出力を一時ファイルとして印刷し、ジョブの終わりにターゲットファイルを置き換えることです。

より簡単に管理できますscript

#!/bin/sh

trap 'rm -f -- "$tmpfile"' EXIT
tmpfile=$(mktemp)
ping -D -O -c 3492 8.8.8.8 | grep received >"$tmpfile"
cat -- "$tmpfile" >/home/user/.direc/packet_drops.txt

そして、より簡単なcronジョブを定義します(失敗する可能性が低いため、デバッグするのは簡単です)。

0 * * * * /path/to/script

awkあるいは、文を簡潔に保つためにファイル操作機能を利用することもできます。

ping -D -O -c 3492 8.8.8.8 | awk -v file=/h..s.txt '/received/ { print >file }'

(このコードブロックの読みやすさのためにファイル名が短縮されました。)

このAWKスクリプトはまだ出力ファイルを切り捨てますが、received入力データで行の一致が見つかった場合にのみそうします。

答え2

Crontabには最小限の環境変数セットがあります。 cronjobがpingまたはgrepコマンドを見つけることができない可能性があります。簡単なコマンドを使用して、cronjobの環境変数を確認できます。

* * * * * env &> /tmp/cron-env.txt

ジョブが一度実行されるのを待ってから再度削除します。 PATH変数の出力を取得し、pingコマンドとgrepコマンドへのパスが含まれていることを確認してください。

以下を使用して、これらのコマンドのパスを見つけることができます。

whereis <command>

これを含まない場合は、cronjobにPATH変数を追加できます。

PATH=/bin:/usr/sbin:/usr/bin:/sbin:
* * * * * some-cron-job

関連情報