*/5 * * * * my command
このエントリは機能しますが、5分ごとに2回実行されるのはなぜですか?
/var/log/cron
には、次のように表示されます。
Jun 16 22:20:01 Test CROND[12512]: (root) CMD (my command)
Jun 16 22:20:01 Test CROND[12516]: (root) CMD (my command)
つまり、2人のユーザーからのものではありません。
crontab -e -u root
で1回だけ入力します。コマンドはphpコマンドです。
説明には、2回実行される理由を示すものはありません。他の場所を見てください。
実行しているシェルスクリプトの場合は、ログファイルにwhoami
とdate
を追加してもらいます。あなたは理由を掘り下げることができるはずです。
タイプps -A | grep crond
、crondが2回実行されていないことを確認してください。
Crontabのwgetには、多くの場合15分の制限があります。私たちの場合、これはまさにその通りであり、それらの15分後、ジョブはタイムアウトで終了し、すぐに再実行されます。したがって、これに対する解決策は、crontabでcronjobを次のように設定することでした。
1 2 * * * root wget --read-timeout=3600 -O - 'http://cron-job-url' >/dev/null 2>&1
...の代わりに
1 2 * * * root wget -O - 'http://cron-job-url' >/dev/null 2>&1
つまり、wgetが重要です。意味3600 = 1時間。必要に応じてそれ以上!
インストールしたアプリケーションのコマンドの場合は、同じエントリが/etc/crontab
または/etc/cron.d/<something>
にすでに追加されている可能性があります。
私は確認します-私のcronも2回実行されます...
Jul 24 14:40:01 localhost cron[2713]: (root) CMD (/etc/Apache2/generator/reloader.do)
Jul 24 14:41:01 localhost cron[9481]: (root) CMD (/etc/Apache2/generator/reloader.do)
Jul 24 14:41:01 localhost cron[10724]: (root) CMD (/etc/Apache2/generator/reloader.do)
Jul 24 14:42:01 localhost cron[20380]: (root) CMD (/etc/Apache2/generator/reloader.do)
Jul 24 14:42:01 localhost cron[20832]: (root) CMD (/etc/Apache2/generator/reloader.do)
私のcrontab
grep -R/var/pool/-eリローダー
/var/spool/cron/crontabs/root:* * * * * /etc/Apache2/generator/reloader.do
の出力:
whoami
date
------
出力:
root
root
Tue Jul 24 14:46:02 CEST 2012
---------
Tue Jul 24 14:46:03 CEST 2012
---------
私の現在の回避策は次のとおりです。
if [ -f /etc/Apache2/generator/reloader.lock ]
then
exit
fi
touch /etc/Apache2/generator/reloader.lock
/etc/Apache2/generator/reloader
rm /etc/Apache2/generator/reloader.lock
しかし、それがなぜ起こるのかという答えではありません...
システム-gentooCron-vixie-cron
一部の ps aux wwf
出力(cronタスク内でランチ)
root 10843 0.0 0.0 16480 560 ? Ss Jun06 0:01 /usr/sbin/cron
root 29797 0.0 0.0 25020 964 ? S 15:08 0:00 \_ /usr/sbin/cron
root 29799 0.0 0.0 9188 1228 ? Ss 15:08 0:00 \_ /bin/bash /etc/Apache2/generator/reloader
root 29822 0.0 0.0 14800 988 ? R 15:08 0:00 \_ ps aux wwf
------
root 8215 0.0 0.0 16480 836 ? Ss 14:23 0:00 /usr/sbin/cron
root 31419 0.0 0.0 25020 968 ? S 15:08 0:00 \_ /usr/sbin/cron
root 31423 0.0 0.0 9188 1228 ? Ss 15:08 0:00 \_ /bin/bash /etc/Apache2/generator/reloader
root 31431 0.0 0.0 14804 1004 ? R 15:08 0:00 \_ ps aux wwf
編集:
Cronプロセスの1つがJun06を開始日として報告していることに気づきました(今日はJun24です)
root 10843 0.0 0.0 16480 560 ? Ss Jun06 0:01 /usr/sbin/cron
root 8215 0.0 0.0 16480 836 ? Ss 14:23 0:00 /usr/sbin/cron
2番目のプロセスレポートは正しく(サーバーのアップリムは約40分です-最近再起動しました)1つの重要な情報-ホストマシンで実行されているVサーバーです。
私が何をしても(/etc/init.d/vixie-cron restart)、同じPIDで開始します
解決済み:
私はその理由を見つけました。 1つのVサーバーが異なるコンテキストで2回実行されました。考えられる説明-マシンの実行中に誰かがコンテキストを変更したため、すべてのプロセスが強制終了されたわけではなく、さらに-vserverの新しいインスタンス(コンテキスト303および3031)に影響を及ぼしました。
root 10843 3031 developer 0.0 0.0 16480 560 ? Ss Jun06 0:01 /usr/sbin/cron
root 16509 303 developer 0.0 0.0 16480 836 ? Ss 15:18 0:00 /usr/sbin/cron
古いプロセスをTERMしましたが、問題は解決しました。
確かに、それが2回実行される原因となっているのはcrontabエントリではありません。何が起こっているのかを知る最も速い方法は、cronジョブスクリプトにデバッグを追加することです。何もしない場合、デフォルトでcron出力はroot@localhost
にメールで送信されるため(これを異なるように構成していない限り)、rootアクセス権があると仮定して、次のようなデバッグ情報をスクリプトに追加します。
echo "Script starting"
date
whoami
そして出力を見てください。これにより、これが2回呼び出される方法を理解することができます。
同じ問題が1回発生しました。私の場合、誤ってcronサービスを2回初期化したことがあります。 cronを停止した後# /etc/init.d/crond stop
そしてそれを再開しました# /etc/init.d/crond start
、それは完璧に機能しました。
これが誰にでも役立つことを願っています。
私はOpenWrtを使用しています。
同じ問題がありますが、cronが1つだけあります:ps | grep crond:
31447 root 1508 S /usr/sbin/crond -c /etc/crontabs -l 8
31454 root 1500 S sh -c ps | grep crond
31456 root 1496 S grep crond
logread | grep cron
May 27 13:15:01 decibox cron.info crond[31447]: crond: USER root pid 1594 cmd /root/check_connect.php.sh
May 27 13:20:01 decibox cron.info crond[31447]: crond: USER root pid 2103 cmd /root/check_connect.php.sh
May 27 13:20:01 decibox cron.info crond[31447]: crond: USER root pid 2325 cmd /root/check_connect.php.sh
May 27 13:25:01 decibox cron.info crond[31447]: crond: USER root pid 2880 cmd /root/check_connect.php.sh
最近、vixie-cronからcronieに移行しましたが、ルートcrontabがユーザーcrontabファイルの複製であることに気付きました。
「crontab-e」をユーザーとrootの両方で実行/実行し、ファイルを調べて重複するコマンドが発行されていないことを確認します。
ルートとして:
ユーザーとして:$ crontab -e
ファイルが非常に類似している場合は、crontabファイルの内容を削除する前に、不要なcrontabの内容に「#TEST」コメントを挿入して、シンボリックリンクやその他の異常が存在しないことを確認することをお勧めします。
Ps-Aを実行しています| grep cron、すべてのジョブを強制終了しても、私の場合は役に立ちませんでした。問題は、すべてのcronジョブを強制終了し、1つのcronデーモンだけで再開した後、同じ親cronPPIDから2つのcronジョブを開始することでした-1つは/ bin/bashを使用し、もう1つは/ bin/shを使用します
解決策はサーバーを再起動することでした。
これは、さまざまなOS(centos6とredhat7)で何度か発生しました。通常、再起動せずにオンラインOSをアップグレードした後です。
誰かが言ったように-おそらくいくつかの異なる文脈。
ネット上で同じプロセスの記事を/ bin/bashでもう1つ/ bin/shでまったく同時に見ました-そうだと思いました-これは私の場合です-しかし、いや、男は何を考えさえしませんでしたこのような奇妙な動作の根本的な原因は、実際には解決策ではない2番目のプロセスを終了させるためのスクリプトロジックを書き始めたところです。
ところでps-A | grep cronは、すべてのcronの子も一覧表示します。通常のcronジョブ、cronプロセスが多いからといって、cronデーモンが多いわけではなく、デーモンが1つだけで、他のデーモンは子です。
ps -ef |一方、grep cronには1つしかリストされていません-なぜですか? ps -efは子をCRONDとしてリストするため、すべての子を取得するにはps -ef | grep -i cron
2つのcrondが実行されているようです。1つはPID12512で、もう1つはPID12516です。
Confファイルのエントリが2つあるため、同じ問題が発生しました。
# grep /syslog /etc/rsyslog.conf /etc/rsyslog.d/50-default.conf
/etc/rsyslog.conf:*.*;auth,authpriv,kern,mail.none -/var/log/syslog
/etc/rsyslog.d/50-default.conf:*.*;auth,authpriv,kern,mail.none -/var/log/syslog
2つのうちの1つに明確にコメントすると、問題が解決します