私はこのクローンを予約しました:
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.txt
cronジョブを実行したときにファイルが切り捨てられたためです。
パイプラインは操作が開始されるとすぐに設定され、リダイレクトは初期設定の一部として実行されます。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