web-dev-qa-db-ja.com

CronTabが実行されていません

Crontab -eと入力して、次のようにubuntu環境でrootユーザーのcronjobをセットアップしました

  34 11 * * * sh /srv/www/live/CronJobs/daily.sh
  0 08 * * 2 sh /srv/www/live/CronJobs/weekly.sh
  0 08 1 * * sh /srv/www/live/CronJobs/monthly.sh

しかし、cronjonは実行されません。私はcronjobが実行されているかどうかを確認しようとしました

pgrep cron

プロセスID 3033を提供します。シェルスクリプトはpythonファイルを呼び出し、電子メールの送信に使用されます。 pythonファイルの実行は問題ありません。エラーはありませんが、cronは実行されません。 daily.shファイルには、次のコードが含まれています。

python /srv/www/live/CronJobs/daily.py
python /srv/www/live/CronJobs/notification_email.py
python /srv/www/live/CronJobs/log_kpi.py
29
Roshan Bhandari

WTF ?! cronjobが実行されない?!

以下は、cronジョブを実行していないデバッグのチェックリストガイドです。

  1. Cronデーモンは実行中ですか?
    • ps ax | grep cronを実行し、cronを探します。
    • Debian:service cron startまたはservice cron restart
  2. Cronは機能していますか?
    • * * * * * /bin/echo "cron works" >> /tmp/file
    • 構文は正しいですか?下記参照。
    • 当然、出力をリダイレクトするファイルへの書き込みアクセス権が必要です。現在存在しない/tmpの一意のファイル名は、常に書き込み可能である必要があります。
  3. コマンドはスタンドアロンで動作しますか?
    • CLIでドライランを実行して、スクリプトにエラーがあるかどうかを確認します
    • コマンドをテストするときは、crontabを編集しているユーザーとしてテストします。これは、ログインまたはルートではない可能性があります
  4. Cronはジョブを実行できますか?
    • /var/log/cron.logまたは/var/log/messagesでエラーを確認してください。
    • Ubuntu:grep CRON /var/log/syslog
    • Redhat:/var/log/cron
  5. 権限を確認してください
    • コマンドに実行可能フラグを設定します:chmod +x /var/www/app/cron/do-stuff.php
    • コマンドの出力をファイルにリダイレクトする場合は、そのファイル/ディレクトリへの書き込み権限があることを確認してください
  6. パスを確認してください
    • she-bangs/hashbangs行を確認してください
    • pATHのような環境変数に依存しないでください。それらの値は、対話セッションの場合とcronの場合とでは異なる可能性が高いためです。
  7. デバッグ中に出力を抑制しない
    • 一般的に使用されるのは、この抑制です:30 1 * * * command > /dev/null 2>&1
    • >/dev/null 2>&1を完全に削除して、標準出力または標準エラーメッセージ出力を再度有効にします。または、書き込みアクセス権がある場所のファイルにリダイレクトします。>>cron.out 2>&1は、呼び出し元のユーザーのホームディレクトリにあるcron.outに標準出力と標準エラーを追加します。

まだ動作しませんか?Yikes!

  1. Cronデバッグレベルを上げます
    • Debian
      • /etc/default/cron
      • EXTRA_OPTS="-L 2"を設定
      • service cron restart
      • tail -f /var/log/syslog実行されたスクリプトを見る
    • Ubuntu
      • /etc/rsyslog.d/50-default.conf
      • cron.crit /var/log/cron.logを追加またはコメントアウトします
      • ロガーの再読み込みSudo /etc/init.d/rsyslog reload
      • cronを再実行します
      • /var/log/cron.logを開き、詳細なエラー出力を探します
    • 注意:デバッグが完了したら、ログレベルを無効にします
  2. Cronを実行し、ログファイルを再度確認します

Cronjob構文

# Minute  Hour  Day of Month      Month         Day of Week    User Command    
# (0-59) (0-23)   (1-31)    (1-12 or Jan-Dec) (0-6 or Sun-Sat)  

    0       2       *             *                *          root /usr/bin/find

この構文は、のみrootユーザーに対して正しいです。通常ユーザーcrontab構文にはUserフィールドがありません(通常ユーザーは他のユーザーとしてコードを実行することはできません)。

# Minute  Hour  Day of Month      Month         Day of Week    Command    
# (0-59) (0-23)   (1-31)    (1-12 or Jan-Dec) (0-6 or Sun-Sat)  

    0       2       *             *                *          /usr/bin/find

クロンタブコマンド

  1. crontab -l
    • ユーザーのすべてのcronタスクをリストします。
  2. crontab -e、特定のユーザーの場合:crontab -e -u agentsmith
    • Crontabファイルの編集セッションを開始します。
    • エディターを終了すると、変更されたcrontabが自動的にインストールされます。
  3. crontab -r
    • Cronスプーラからcrontabエントリを削除しますが、crontabファイルからは削除しません。
103
Jens A. Koch

最後に解決策を見つけました。ソリューションは次のとおりです。

  1. python crontabを介して実行されるスクリプトで相対パスを使用しないでください。

    import os
    import sys
    import time, datetime
    
    CLASS_PATH = '/srv/www/live/mainapp/classes'
    SETTINGS_PATH = '/srv/www/live/foodtrade'
    sys.path.insert(0, CLASS_PATH)
    sys.path.insert(1,SETTINGS_PATH)
    
    import other_py_files
    
  2. 代わりにcrontabコードを抑制しないで、代わりにメールサーバーを使用してユーザーのメールを確認してください。これにより、今後の状況がより明確になります。

6
Roshan Bhandari

Crontabが失敗する別の理由:%文字の特別な処理。

manファイル から:

The entire command portion of the line, up to a newline or a
"%" character, will be executed by /bin/sh or by the Shell specified
in the Shell variable of the cronfile.  A "%" character in the
command, unless escaped with a backslash (\), will be changed into
newline characters, and all data after the first % will be sent to
the command as standard input.

私の特定のケースでは、date --date="7 days ago" "+%Y-%m-%d"を使用してスクリプトのパラメーターを生成していましたが、サイレントに失敗していました。私はついにsyslogをチェックし、コマンドが%記号で切り捨てられたときに何が起こっているかを知りました。次のようにエスケープする必要があります。

date --date="7 days ago" "+\%Y-\%m-\%d"

詳細はこちらをご覧ください:

http://www.ducea.com/2008/11/12/using-the-character-in-crontab-entries/

5
Luciano

私が学んだ2つのポイントを追加したい:

  1. /etc/cron.d/に置かれるcron構成ファイルには、ドット(。)を含めないでください。そうしないと、cronによって読み取られません。
  2. コマンドを実行しているユーザーが/ etc/shadowにない場合。 cronのスケジュールは許可されません。

Refs:

  1. http://manpages.ubuntu.com/manpages/xenial/en/man8/cron.8.html
  2. https://help.ubuntu.com/community/CronHowto
1
Sang Nguyen

Cronが実行されていないのと同じ問題が発生しました。 crontabで言及したように、Cronsによって権限と所有者を変更し、所有者を変更して修正し、Cronjobs 644の権限を付与しました

0
Sachin Patil

ユーザーのcrontabが実行されていない別の理由を見つけました:ホスト名がホストファイルに存在しません:

user@ubuntu:~$ cat /etc/hostname
ubuntu

ここで、hostsファイル:

user@ubuntu:~$ cat /etc/hosts
127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

これはUbuntu 14.04.3 LTS上にあり、修正する方法はhostsファイルにホスト名を追加するなので、次のようになります。

user@ubuntu:~$ cat /etc/hosts
127.0.0.1 ubuntu localhost

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
0
Javi Romero

私にとっての解決策は、cronが実行しようとしたファイルが暗号化されたディレクトリ、より具体的には/ home /のユーザーディレクトリにあったことでした。 crontabはルートとして構成されましたが、実行中のスクリプトは/ home/cronの暗号化されたユーザーディレクトリに存在するため、ユーザーが実際にログインしたときにのみこのディレクトリを読み取ることができます。

/home/.ecryptfs/<yourusername>

その場合は、暗号化されたホームディレクトリがあります。

私が修正したのは、スクリプトを暗号化されていないディレクトリに移動することで、すべてが正常に機能しました。

0
theINtoy