web-dev-qa-db-ja.com

このcronエントリが2回実行されるのはなぜですか?

*/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コマンドです。

21
erotsppa

説明には、2回実行される理由を示すものはありません。他の場所を見てください。

  • 2人のユーザーがそれを呼び出しますか?
  • 二度入りますか?
  • それはそれ自体を呼びますか?
  • 繰り返しの動作条件に設定されていますか?

実行しているシェルスクリプトの場合は、ログファイルにwhoamidateを追加してもらいます。あなたは理由を掘り下げることができるはずです。

更新

タイプps -A | grep crond、crondが2回実行されていないことを確認してください。

45
Stefan Mai

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時間。必要に応じてそれ以上!

8
anoraq

インストールしたアプリケーションのコマンドの場合は、同じエントリが/etc/crontabまたは/etc/cron.d/<something>にすでに追加されている可能性があります。

3
sth

私は確認します-私の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しましたが、問題は解決しました。

3
sirkubax

確かに、それが2回実行される原因となっているのはcrontabエントリではありません。何が起こっているのかを知る最も速い方法は、cronジョブスクリプトにデバッグを追加することです。何もしない場合、デフォルトでcron出力はroot@localhostにメールで送信されるため(これを異なるように構成していない限り)、rootアクセス権があると仮定して、次のようなデバッグ情報をスクリプトに追加します。

echo "Script starting"
date
whoami

そして出力を見てください。これにより、これが2回呼び出される方法を理解することができます。

1
Eddie

同じ問題が1回発生しました。私の場合、誤ってcronサービスを2回初期化したことがあります。 cronを停止した後# /etc/init.d/crond stopそしてそれを再開しました# /etc/init.d/crond start、それは完璧に機能しました。

これが誰にでも役立つことを願っています。

1
Luis Parada

私は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
0
Saphiro

最近、vixie-cronからcronieに移行しましたが、ルートcrontabがユーザーcrontabファイルの複製であることに気付きました。

「crontab-e」をユーザーとrootの両方で実行/実行し、ファイルを調べて重複するコマンドが発行されていないことを確認します。

ルートとして:

crontab -e

ユーザーとして:$ crontab -e

ファイルが非常に類似している場合は、crontabファイルの内容を削除する前に、不要なcrontabの内容に「#TEST」コメントを挿入して、シンボリックリンクやその他の異常が存在しないことを確認することをお勧めします。

0
Roger

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

0
blur

2つのcrondが実行されているようです。1つはPID12512で、もう1つはPID12516です。

0
David Schwartz

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つに明確にコメントすると、問題が解決します

0