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
WTF ?! cronjobが実行されない?!
以下は、cronジョブを実行していないデバッグのチェックリストガイドです。
ps ax | grep cron
を実行し、cronを探します。service cron start
またはservice cron restart
* * * * * /bin/echo "cron works" >> /tmp/file
/tmp
の一意のファイル名は、常に書き込み可能である必要があります。/var/log/cron.log
または/var/log/messages
でエラーを確認してください。grep CRON /var/log/syslog
/var/log/cron
chmod +x /var/www/app/cron/do-stuff.php
30 1 * * * command > /dev/null 2>&1
>/dev/null 2>&1
を完全に削除して、標準出力または標準エラーメッセージ出力を再度有効にします。または、書き込みアクセス権がある場所のファイルにリダイレクトします。>>cron.out 2>&1
は、呼び出し元のユーザーのホームディレクトリにあるcron.out
に標準出力と標準エラーを追加します。まだ動作しませんか?Yikes!
/etc/default/cron
EXTRA_OPTS="-L 2"
を設定service cron restart
tail -f /var/log/syslog
実行されたスクリプトを見る/etc/rsyslog.d/50-default.conf
cron.crit /var/log/cron.log
を追加またはコメントアウトしますSudo /etc/init.d/rsyslog reload
/var/log/cron.log
を開き、詳細なエラー出力を探します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
クロンタブコマンド
crontab -l
crontab -e
、特定のユーザーの場合:crontab -e -u agentsmith
crontab -r
最後に解決策を見つけました。ソリューションは次のとおりです。
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
代わりにcrontabコードを抑制しないで、代わりにメールサーバーを使用してユーザーのメールを確認してください。これにより、今後の状況がより明確になります。
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/
私が学んだ2つのポイントを追加したい:
Refs:
Cronが実行されていないのと同じ問題が発生しました。 crontabで言及したように、Cronsによって権限と所有者を変更し、所有者を変更して修正し、Cronjobs 644の権限を付与しました
ユーザーの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
私にとっての解決策は、cronが実行しようとしたファイルが暗号化されたディレクトリ、より具体的には/ home /のユーザーディレクトリにあったことでした。 crontabはルートとして構成されましたが、実行中のスクリプトは/ home/cronの暗号化されたユーザーディレクトリに存在するため、ユーザーが実際にログインしたときにのみこのディレクトリを読み取ることができます。
/home/.ecryptfs/<yourusername>
その場合は、暗号化されたホームディレクトリがあります。
私が修正したのは、スクリプトを暗号化されていないディレクトリに移動することで、すべてが正常に機能しました。