cronの使い方と設定方法

最近は主要なレンタルサーバー会社でもレンタルサーバー上でcronを実行できるところが増えてきました。

これはさくらのレンタルサーバーの機能紹介のページですが「CRON(スクリプト実行ツール)」が機能に含まれていることが分かります。

さくらのレンタルサーバー cronあり

 

これはエックスサーバーですが、当たり前のように「Cron」の機能が付いています。

エックスサーバー cronあり

 

cronとは何か?

cronは、クーロンと読みます。

クローンだと複製の意味だと思われて話がややこしくなります。

crond(cron)は、スケジュール通りにコマンドやスクリプトを実行するデーモンです。

スケジュールを設定することで定期的にコマンドやスクリプトを実行できます。

 

デーモンは、英語では deamon と綴るので、悪魔の方の demon とは違います。

demon → デーモン、悪魔、鬼(ギリシャ神話では神と人間の中間)

devil → ちなみにデビルは悪い悪魔でキリスト教で神の敵対者

satan → ちなみにサタンは、デビルの王で一番悪い、キリスト教で神の敵対者の王

deamon → デーモン、ダイモン、ディーモン、守護神、ギリシャ神話で神々と人間の中間にいる神様

 

完全に余談ですが、ここまで書いて思ったのがソクラテスが「ダイモーン」がどうのこうの語っている場面があったなと思って調べてみたら、プラトンが記述した「ダイモーン」とcronなどのデーモンは同じ綴り(deamon)でした。

 

整理ですが、

cron → プログラム名、プロセス名

crond → デーモンプロセスとして実際に動いているプロセス

たとえば、サーバー上でコマンドを実行すると、

# ps -ef | grep cron
root       538     1  0  4月26 ?      00:00:05 /usr/sbin/crond -n ← crond として動いている
root     22124 21890  0 08:41 pts/0    00:00:00 grep --color=auto cron

「cron」ではなく「crond」として動いています。

 

manコマンドで確認します。

※定期的にmanを読むと新しい発見があるので少しずつ読みましょう。

crondで調べました。

# man crond | col -b
CRON(8)                        System Administration                        CRON(8)

NAME
       crond - daemon to execute scheduled commands

SYNOPSIS
       crond [-c | -h | -i | -n | -p | -P | -s | -m<mailcommand>]
       crond -x [ext,sch,proc,pars,load,misc,test,bit]

DESCRIPTION
       Cron is started from /etc/rc.d/init.d or /etc/init.d when classical sysvinit
       scripts are used. In case systemd is enabled, then unit  file  is  installed
       into  /lib/systemd/system/crond.service  and  daemon is started by systemctl
       start crond.service command. It returns immediately, thus, there is no  need
       to need to start it with the '&' parameter.

       Cron  searches  /var/spool/cron  for  crontab  files  which  are named after
       accounts in /etc/passwd; The found crontabs  are  loaded  into  the  memory.
       Cron  also  searches  for  /etc/anacrontab  and any files in the /etc/cron.d
       directory, which have a different format (see  crontab(5)).   Cron  examines
       all  stored crontabs and checks each job to see if it needs to be run in the
       current minute.  When executing commands, any output is mailed to the  owner
       of  the crontab (or to the user specified in the MAILTO environment variable
       in the crontab, if such exists).  Any job output can also be sent to  syslog
       by using the -s option.

       There  are two ways how changes in crontables are checked.  The first method
       is checking the modtime of a file.  The second method is using  the  inotify
       support.  Using of inotify is logged in the /var/log/cron log after the dae‐
       mon is started.  The inotify support checks for changes  in  all  crontables
       and accesses the hard disk only when a change is detected.

       When  using  the  modtime option, Cron checks its crontables' modtimes every
       minute to check for any  changes  and  reloads  the  crontables  which  have
       changed.  There is no need to restart Cron after some of the crontables were
       modified.  The modtime option is also used when inotify can not be  initial‐
       ized.

       Cron checks these files and directories:

       /etc/crontab
              system  crontab.   Nowadays the file is empty by default.  Originally
              it was usually used to run daily, weekly, monthly jobs.   By  default
              these  jobs  are  now run through anacron which reads /etc/anacrontab
              configuration file.  See anacrontab(5) for more details.

       /etc/cron.d/
              directory that contains system cronjobs stored for different users.

       /var/spool/cron
              directory that contains user crontables created by the  crontab  com‐
              mand.

       Note  that the crontab(1) command updates the modtime of the spool directory
       whenever it changes a crontab.

   Daylight Saving Time and other time changes
       Local time changes of less than three hours, such as  those  caused  by  the
       Daylight  Saving  Time  changes,  are  handled  in a special way.  This only
       applies to jobs that run at a specific time and jobs that run with a  granu‐
       larity  greater  than one hour.  Jobs that run more frequently are scheduled
       normally.

       If time was adjusted one hour forward, those jobs that would have run in the
       interval that has been skipped will be run immediately.  Conversely, if time
       was adjusted backward, running the same job twice is avoided.

       Time changes of more than 3 hours are considered to be  corrections  to  the
       clock or the timezone, and the new time is used immediately.

       It  is  possible to use different time zones for crontables.  See crontab(5)
       for more information.

   PAM Access Control
       Cron supports access control with PAM if the system has PAM installed.   For
       more  information,  see  pam(8).   A  PAM  configuration  file  for crond is
       installed in /etc/pam.d/crond.  The daemon loads the  PAM  environment  from
       the pam_env module.  This can be overridden by defining specific settings in
       the appropriate crontab file.

OPTIONS
       -h     Prints a help message and exits.

       -i     Disables inotify support.

       -m     This option allows you to specify a shell command to use for  sending
              Cron  mail  output  instead  of  using  sendmail(8) This command must
              accept a fully formatted mail  message  (with  headers)  on  standard
              input  and  send  it as a mail message to the recipients specified in
              the mail headers.  Specifying the string off  (i.e.,  crond  -m  off)
              will disable the sending of mail.

       -n     Tells  the  daemon to run in the foreground.  This can be useful when
              starting it out of init. With this option is  needed  to  change  pam
              setting.  /etc/pam.d/crond must not enable pam_loginuid.so module.

       -p     Allows Cron to accept any user set crontables.

       -P     Don't set PATH.  PATH is instead inherited from the environment.

       -c     This option enables clustering support, as described below.

       -s     This option will direct Cron to send the job output to the system log
              using syslog(3).  This is useful if your system does not  have  send‐
              mail(8), installed or if mail is disabled.

       -x     This option allows you to set debug flags.

SIGNALS
       When  the  SIGHUP is received, the Cron daemon will close and reopen its log
       file.  This proves to be useful in scripts which rotate and age  log  files.
       Naturally, this is not relevant if Cron was built to use syslog(3).

CLUSTERING SUPPORT
       In  this  version  of  Cron  it  is possible to use a network-mounted shared
       /var/spool/cron across a cluster of hosts and specify that only one  of  the
       hosts  should  run the crontab jobs in this directory at any one time.  This
       is  done  by  starting   Cron   with   the   -c   option,   and   have   the
       /var/spool/cron/.cron.hostname  file contain just one line, which represents
       the hostname of whichever host in the cluster should run the jobs.  If  this
       file  does  not exist, or the hostname in it does not match that returned by
       gethostname(2), then all crontab files in this directory are ignored.   This
       has no effect on cron jobs specified in the /etc/crontab file or on files in
       the /etc/cron.d directory.  These files are always run and considered  host-
       specific.

       Rather  than  editing  /var/spool/cron/.cron.hostname  directly,  use the -n
       option of crontab(1) to specify the host.

       You should ensure that all hosts in a cluster,  and  the  file  server  from
       which  they  mount  the  shared crontab directory, have closely synchronised
       clocks, e.g., using ntpd(8), otherwise  the  results  will  be  very  unpre‐
       dictable.

       Using  cluster  sharing automatically disables inotify support, because ino‐
       tify cannot be relied on with network-mounted shared file systems.

CAVEATS
       All crontab files have to be regular files or  symlinks  to  regular  files,
       they must not be executable or writable for anyone else but the owner.  This
       requirement can be overridden by using the -p option on  the  crond  command
       line.   If  inotify support is in use, changes in the symlinked crontabs are
       not automatically noticed by the cron daemon.  The cron daemon must  receive
       a SIGHUP signal to reload the crontabs.  This is a limitation of the inotify
       API.

       The syslog output will be  used  instead  of  mail,  when  sendmail  is  not
       installed.

SEE ALSO
       crontab(1), crontab(5), inotify(7), pam(8)

AUTHOR
       Paul Vixie ?vixie@isc.org?
       Marcela Ma?la?ova ?mmaslano@redhat.com?
       Colin Dean ?colin@colin-dean.org?

cronie                               2013-09-26                             CRON(8)

 

日本語に翻訳しました。(Google翻訳です)

CRON(8)システム管理CRON(8)


       
crond - スケジュールされたコマンドを実行するデーモン

シノプシス
       
crond [-c | -h | -i | -n | -p | -P | -s | -m <mailcommand>]
       
crond -x [ext、sch、proc、pars、ロード、その他、テスト、ビット]

DESCRIPTION
       
古典的なsysvinitスクリプトが使用されている場合、Cronは/etc/rc.d/init.dまたは/etc/init.dから起動されます。
       
systemdが有効な場合、ユニットファイルは/lib/systemd/system/crond.serviceにインストールされ、デーモンはsystemctl start crond.serviceコマンドによって起動されます。
       
それはすぐに戻ります。したがって、 '&'パラメータで開始する必要はありません。

       / etc / passwdのアカウント名の後ろにあるcrontabファイルのために、/ var / spool / cronを検索します。見つかったcrontabはメモリにロードされます。
       
Cronはまた、/ etc / anacrontabと、/etc/cron.dディレクトリ内の異なるフォーマットを持つファイルを検索します(crontab(5)を参照)。
       
Cronは格納されているすべてのcrontabを調べ、各ジョブをチェックして現在の分で実行する必要があるかどうかを確認します。
       
コマンドを実行すると、crontabの所有者(またはcrontab内のMAILTO環境変数で指定されたユーザがあれば)に出力されます。
       
すべてのジョブ出力は、-sオプションを使用してsyslogに送信することもできます。

       crontablesの変更がどのようにチェックされるかは、2つの方法があります。
       
最初の方法はファイルのmodtimeをチェックすることです。
       
2番目の方法は、inotifyサポートを使用しています。
       
inotifyの使用は、デーモンの起動後に/ var / log / cronログに記録されます。
       
inotifyサポートは、すべてのcrontablesの変更をチェックし、変更が検出された場合にのみハードディスクにアクセスします。

       modtimeオプションを使用すると、Cronはcrontablesのmodtimesを毎分チェックして変更をチェックし、変更されたcrontablesをリロードします。
       
crontablesの一部が変更された後にCronを再起動する必要はありません。
       
modotオプションは、inotifyを初期化できない場合にも使用されます。

       Cronはこれらのファイルとディレクトリをチェックします:

       / etc / crontab
              
システムcrontab。現在、ファイルはデフォルトでは空です。もともとは、毎日、毎週、毎月のジョブを実行するために使用されていました。
              
デフォルトでは、これらのジョブはanacronによって実行され、/ etc / anacrontab設定ファイルを読み込みます。
              
詳細は、anacrontab(5)を参照してください。

       /etc/cron.d/
              
ディレクトリには、さまざまなユーザー用に格納されたシステムのcronジョブが含まれています。

       / var / spool / cron
              
crontabコマンドで作成されたユーザーのcrontablesを含むディレクトリ。

       crontab(1)コマンドは、crontabを変更するたびにスプールディレクトリのmodtimeを更新することに注意してください。

   夏時間とその他の時間の変更
       
夏時間の変更に起因するような3時間未満の現地時間の変更は、特別な方法で処理されます。
       
これは、特定の時間に実行されるジョブと、1時間を超える粒度で実行されるジョブにのみ適用されます。
       
頻繁に実行されるジョブは正常にスケジュールされます。

       時間を1時間前に調整した場合、その間隔で実行されたジョブはスキップされ、直ちに実行されます。
       
逆に、時間を後方に調整すると、同じジョブを2回実行することは回避されます。

       3時間以上の時間の変化は、時計またはタイムゾーンの修正とみなされ、新しい時間はすぐに使用されます。

       crontablesに異なるタイムゾーンを使用することは可能です。詳細については、crontab(5)を参照してください。

   PAMアクセス制御
       
システムにPAMがインストールされている場合、CronはPAMによるアクセス制御をサポートします。
       
詳細は、pam(8)を参照してください。
       
crondのPAM設定ファイルは/etc/pam.d/crondにインストールされています。
       
デーモンは、pam_envモジュールからPAM環境をロードします。
       
これは、適切なcrontabファイルで特定の設定を定義することによって無効にすることができます。

オプション
       
-hヘルプメッセージを表示して終了します。

       -i inotifyサポートを無効にします。

       -mこのオプションを使用すると、sendmailを使用せずにCronメール出力を送信するためのシェルコマンドを指定できます。
              
このコマンドは、標準入力で完全にフォーマットされたメールメッセージ(ヘッダー付き)を受け入れ、メールヘッダーで指定された受信者にメールメッセージとして送信する必要があります。
              
文字列をオフ(つまり、crond -m off)に指定すると、メールの送信が無効になります。

       -nデーモンにフォアグラウンドで実行するよう指示します。
              
これはinitから起動するときに便利です。このオプションは、PAMの設定を変更するために必要です。
              
/etc/pam.d/crondはpam_loginuid.soモジュールを有効にしてはいけません。

       -p Cronがユーザが設定した任意のcrontablesを受け入れることを許可します。

       -P PATHを設定しません。代わりにPATHは環境から継承されます。

       -cこのオプションは、後述のようにクラスタリングのサポートを有効にします。

       -sこのオプションは、syslogを使用してジョブ出力をシステムログに送信するようにCronに指示します。
              
これは、あなたのシステムにsendmail(8)がインストールされていないか、またはメールが無効になっている場合に便利です。

       -xこのオプションを使用すると、デバッグフラグを設定できます。

信号
       
SIGHUPが受信されると、Cronデーモンはそのログファイルを閉じて再オープンします。
       
これは、ログファイルをローテーションして保存するスクリプトで有用であることがわかります。
       
当然、Cronがsyslogを使用するように構築されている場合、これは関係ありません。

クラスターサポート
       
このバージョンのCronでは、ホストのクラスタにネットワークマウントされた共有/ var / spool / cronを使用することができ、ホストの1つだけがいつでもこのディレクトリのcrontabジョブを実行するように指定できます。
       
これは、-cオプションを指定してCronを起動し、/var/spool/cron/.cron.hostnameファイルに、クラスタ内のどのホストのジョブを実行するかのホスト名を表す1行だけを含むようにします。
       
このファイルが存在しないか、またはそのホスト名がgethostnameによって返されたものと一致しない場合、このディレクトリ内のすべてのcrontabファイルは無視されます。
       
これは、/ etc / crontabファイルまたは/etc/cron.dディレクトリ内のファイルで指定されたcronジョブには影響しません。
       
これらのファイルは常に実行され、ホスト固有のものとみなされます。

       /var/spool/cron/.cron.hostnameを直接編集するのではなく、crontabの-nオプションを使用してホストを指定します。

       クラスター内のすべてのホストと共有crontabディレクトリーをマウントするファイル・サーバーが、例えばntpdを使用してクロックを密接に同期させていることを確認する必要があります。そうしないと、結果が予測できなくなります。

       クラスタ共有を使用すると、inotifyをネットワークマウントの共有ファイルシステムに依存させることができないため、自動的にinotifyサポートが無効になります。

警告
       
すべてのcrontabファイルは、通常のファイルまたは通常のファイルへのシンボリックリンクである必要がありますが、実行可能または書き込み可能であってはいけません。
       
この要件は、crondコマンドラインで-pオプションを使用することで無効にすることができます。
       
inotifyサポートが使用されている場合、シンボリックリンクされたcrontabの変更は、cronデーモンによって自動的に通知されません。
       
crontabをリロードするには、cronデーモンがSIGHUPシグナルを受け取る必要があります。これはinotify APIの制限です。

       sendmailがインストールされていない場合、メールの代わりにsyslog出力が使用されます。

関連項目
       
crontab(1)、crontab(5)、inotify(7)、pam(8)

著者
       
Paul Vixie?vixie@isc.org?
       
Marcela Ma?la?ova?mmaslano@redhat.com?
       
Colin Dean ?colin@colin-dean.org?

cronie 2013-09-26 CRON(8)

 

実は以下のように「man cron」でも表示されます。

ただし1993年12月20日の日付になっていて、且つ「/var/cron/tabs」など古い情報のままなので注意です。

$ man cron | col -b
<standard input>:70: warning [p 1, 4.3i]: cannot adjust line
CRON(8)                                System Manager's Manual                                CRON(8)


       cron - 予定されたコマンドを実行するデーモン(Vixie Cron)


       cron


       cron  は /etc/rc または /etc/rc.local から起動されるべきである。 すぐに(シェルに)戻るので、'&'
       を付けて起動する必要はない。

       cron  は  /etc/passwd  にあるアカウントをファイル名に持つ  crontab  ファイルを  /var/cron/tabs
       から探し、見つけた  crontab  ファイルをメモリに読み込む。  また  cron  は  /etc/crontab も見る
       (このファイルのフォーマットは少々異なっている:    crontab(5)    を参照)。    cron     は     1
       分ごとに起きて、読み込まれた                     crontab                    ファイルを評価し、
       それぞれのコマンドを今起動すべきかどうかチェックする。      コマンドを実行すると、全ての出力を
       crontab  ファイルの所有者にメールする  (または  MAILTO  環境変数が  crontab ファイルにあれば、
       そこで指定されたユーザーに送る)。

       さらに cron は 1 分ごとにスプールディレクトリ(または /etc/crontab ファイル)の最終修正時刻(mod‐
       time)をチェックし、もし変更されていれば、                   すべての                   crontab
       ファイルの最終修正時刻をチェックし、 変更された crontab  ファイルを読み直す。  よって  crontab
       ファイルを修正するたびに    cron   を再起動する必要はない。   crontab(1)   コマンドは、crontab
       ファイルが変更されたかどうかにかかわらず、
       スプールディレクトリの最終修正時刻を更新することに注意せよ。


       crontab(1), crontab(5)


       Paul Vixie <paul@vix.com>

4th Berkeley Distribution                  20 December 1993                                   CRON(8)

 

crontabの設定方法

crond(cron) を利用して特定のスケジュールを設定してコマンドやスクリプトを実行する場合は、crontab に記述します。

crontabの書き方

基本的なcrontabの記述は「この時刻、この日付で、このコマンドを使用せよ」という順番です。

各ユーザーはそれぞれ自分の crontab(ファイル)を持っています。

権限

crondから実行されるコマンドやスクリプトの実行権限は、crontab を所有しているユーザの権限で実行されます。

→だから、operatorアカウントが作成してoperatorが所有しているスクリプトを、rootがrootのcrontabに設定して実行するとrootの権限で実行されます。

コメントアウトについて

行の先頭に#(シャープ記号) があるとコメントアウトしているとみなされ、スキップされます。(無視されます)

【例】
#0 0-23/6 * * * /usr/bin/python /home/test_script/wordpress.py >> /var/log/wordpress.log 2>&1 → 行の先頭が#なのでコメントアウトされている状態です。

 

コメントアウトについてはいろんな表現があります。

「コメントする」 → #を付ける → 無視される

「コメントアウトする」 → #を付ける → 無視される

「コメントを外す」  → #を消す → 実行される

「コメントアウトを外す」 → #を消す → 実行される

ようするに#(シャープ)を付けるか外すかということです。

 

コメントの注意点について

もう1つ、コメント時の注意点です。

コマンドが書いてある行に注釈的にコメントを追加できません。

【例】

0 0-23/6 * * * /usr/bin/python /home/test_script/wordpress.py #このスクリプトはテストです ← コマンド行にコメントを書くとエラーになる。

 

実際にやって試してみました。

# crontab テスト
* * * * * /usr/bin/date >> /home/test_script/cron_test.txt >> /home/test_script/cron_test.txt # エラーになるかどうかテスト ←わざとコマンド行に#(シャープ)を入れてみる。

 

数分後に「/home/test_script/cron_test.txt」を確認したところ、

$ cat cron_test.txt
2017年  5月  5日 金曜日 09:50:01 JST
2017年  5月  5日 金曜日 09:51:01 JST
2017年  5月  5日 金曜日 09:52:01 JST
2017年  5月  5日 金曜日 09:53:01 JST
2017年  5月  5日 金曜日 09:54:01 JST
2017年  5月  5日 金曜日 09:55:01 JST
2017年  5月  5日 金曜日 09:56:01 JST
2017年  5月  5日 金曜日 09:57:01 JST
2017年  5月  5日 金曜日 09:58:01 JST
2017年  5月  5日 金曜日 09:59:02 JST

問題なく実行されています。。

/var/log/cronログを確認してみても

# tail cron
May  5 09:52:01 tk2-xxx-xxxxx CROND[23175]: (test_script) CMD (/usr/bin/date >> /home/test_script/cron_test.txt # \343\202\250\343\203\251\343\203\274\343\201\253\343\201\252\343\202\213\343\201\213\343\201\251\343\201\206\343\201\213\343\203\206\343\202\271\343\203\210)
May  5 09:53:01 tk2-xxx-xxxxx CROND[23181]: (test_script) CMD (/usr/bin/date >> /home/test_script/cron_test.txt # \343\202\250\343\203\251\343\203\274\343\201\253\343\201\252\343\202\213\343\201\213\343\201\251\343\201\206\343\201\213\343\203\206\343\202\271\343\203\210)
May  5 09:54:01 tk2-xxx-xxxxx CROND[23185]: (test_script) CMD (/usr/bin/date >> /home/test_script/cron_test.txt # \343\202\250\343\203\251\343\203\274\343\201\253\343\201\252\343\202\213\343\201\213\343\201\251\343\201\206\343\201\213\343\203\206\343\202\271\343\203\210)
May  5 09:55:01 tk2-xxx-xxxxx CROND[23386]: (test_script) CMD (/usr/bin/date >> /home/test_script/cron_test.txt # \343\202\250\343\203\251\343\203\274\343\201\253\343\201\252\343\202\213\343\201\213\343\201\251\343\201\206\343\201\213\343\203\206\343\202\271\343\203\210)

 

特に問題なく実行されていますね。

(日本語が文字化けしていますが)

ただ、「man 5 crontab」コマンドでは以下のように記述があります。

       空行および行頭のスペース・タブは無視される。    行先頭の空白以外の文字が   #
       の行はコメント行であり、無視される。                                    cron
       コマンドとしての行に注釈としてのコメントを入れることはできない。 ←この文言の正しい解釈が不明。コメントを入れることができて且つエラーにならなかった。
       それらはコマンドの一部とみなされてしまう。
       同様に、環境変数を設定している行にコメントを入れることはできない。

 

「コマンドとしての行に注釈としてのコメントを入れることはできない。それらはコマンドの一部とみなされてしまう。同様に、環境変数を設定している行にコメントを入れることはできない。」

この文言の正確な解釈が不明なので、私の認識と異なる可能性があります。

なので、manコマンドが正しいとするなら、コマンドを書いている行にコメントを入れるのは控えた方がいいです。

(エラーになるかどうか関係なく控える)

 

コマンド行には「コマンド」か「環境変数」を設定できる

つまり、crontabには以下の3種類を記述できるということです。

  • コマンド or スクリプト
  • 環境変数の設定
  • コメント

ここで「なぜ環境変数なの?」を思った方もいるかもしれません。

「man 5 crontab」コマンドを実行すると以下の記述があります。

crontab    の動作行は、    環境変数の設定か   cronコマンドのいずれかである。
環境変数の設定は以下の形式をとる:

           name = value

ただし、等号 (=) 両側のスペースはなくても良い。

 

私も最初は「なぜ環境変数?」と疑問に思いました。

しかし何度もcronを利用した方なら分かると思いますが、cronの環境変数を確認するとコマンドパスが全然通っていなくて後でエラーになっているとか、そもそも実行されずに終了していた経験があると思います。

つまり、cronからコマンドやスクリプトを実行する場合は「環境変数が設定されていない」「コマンドパスが通っていない」という前提で考えた方がいいです。

そのため、卵が先か鶏が先かという議論になるかもしれませんが、crontabに環境変数の設定もすることができます。

※ちなみに環境変数の設定もコマンドであると考えるならできて当たり前です。

 

以下、例ですが、この場合は「PATH="/usr/bin:$PATH"」が全体に影響します。

(すぐ1行下のdateコマンドだけでなく、2行目、3行目にも影響します)

# crontab テスト
PATH="/usr/bin:$PATH" ←環境変数の設定を入れることができる
* * * * * date >> /home/test_script/cron_test.txt  

 

たとえば、全体に影響させずにこのコマンド行だけに環境変数設定したいなら、以下の書き方ができます。

# crontab テスト
* * * * * PATH="/usr/bin:$PATH" date >> /home/test_script/cron_test.txt  ←コマンド行に環境変数の設定を入れることもできる

 

スケジュールの設定

スケジュールは5つの項目を設定できます。

左から順番に「分」「時」「日」「月」「曜日」です。

 

以下、時間と日付フィールドです。

フィールド 指定可能な値
---------- --------------
分          0-59
時          0-23
月内日      1-31
月          1-12 (もしくは名前。下記を参照)
曜日        0-7 (0 と 7 は日曜日。もしくは名前)

 

アスタリスク  (*)  も指定できます。

アスタリスクの意味は「すべて」です。

「分」のフィールドに「*」を使用すると、「00」「01」「02」「03」「04」・・・と毎分実行されます。

 

数値の範囲も指定できます。

範囲は二つの数をハイフンでつなげます。

例えば「時」に 8-11 を指定すると、8時,9時,10時,11時に実行されます。

リスト形式で設定することもできます。

カンマで区切ってリストを作ります。

例:1,2,5,9    0-4,8-12

 

間隔値を範囲とともに指定することもできます。

範囲の後に /数値 で、範囲内で指定数値ずつ実行されることになります。

例えば「時」フィールドに「0-23/2」と指定すると、コマンドは「0時~23時(つまり一日中)」2時間おきに実行されます。

 

どのcrontabに書けばいいのか?

複数の crontab があるので注意しましょう。

よくありがちなのが、何か裏側でスクリプトが動いているらしいが、よく分からないので放置されている状態です。

  • crontabコマンドで編集する
  • /etc/crontab ファイルを直接編集する
  • /var/spool/cron/各アカウント ファイルを直接編集する

 

どのやり方でも間違いではないと思いますが、私の推奨は/etc配下のcrontabを設定するのではなく、crontabコマンドを実行して/var/spool/cronに集める方法を推奨します。

 

メリット

crontabコマンドを実行して/var/spool/cronに集める方法には、以下のメリットがあります。

  • /var/spool/cronディレクトリを確認するだけで誰がcronを設定しているのかが分かるので管理がしやすい
  • crontabコマンドを使用することになり、構文を間違えるとエラーになるので気が付きやすい

実際に間違えてみると以下のようなエラーが出力されるのですぐに気が付きます。

# crontab -e ← crontabコマンドで編集
crontab: installing new crontab
"/tmp/crontab.OfH8tf":3: bad minute ←3行目がエラーであると教えてくれる
errors in crontab file, can't install.
Do you want to retry the same edit?

 

デメリット

crontabコマンドは、「編集オプション」と「削除オプション」がややこしいです。

       -r オプションは、現在の crontab を削除する。

       -e   オプションは、環境変数   VISUAL   もしくは   EDITOR    で指定されている
       エディターを使って、現在の          crontab         を編集するのに使われる。
       編集終了後、変更された crontab は自動的にインストールされる。

 

間違って「-r」オプションを付けて実行すると、crontabの設定がすべて消えます。

-r の r は「remove」だと覚えたとしても、-e の e は、「erase」の e ではないかと迷うときもあります。

そういう時は、一度「crontab -l」で設定内容を出力してから「crontab -e」コマンドを実行するか、環境変数で「crontab -r」コマンド実行すると「crontab -ir」コマンドになるようにエイリアスを設定しましょう。

ちなみに、「crontab -r」だと一瞬ですべて削除されて二度と復活しませんが、「crontab -ir」だと「本当に削除しますか?」の確認が入ります。

# crontab -ir ← -iオプションを付けると、確認してくれる
crontab: really delete root's crontab?

 

エイリアスの設定方法

全員に対してエイリアスを設定したいので「/etc/profile」ファイルに設定します。

# cp -ip /etc/profile /etc/profile_20170505
# vi profile
↓一番下に追加する。
alias crontab='crontab -i'

 

設定を入れたらsourceコマンドで設定を反映させます。

# source /etc/profile

 

若干怖いですが試してみます。

crontab -r ←削除コマンドを実行してみる
crontab: really delete root's crontab? ←確認のプロンプトが表示される

 

以上で設定は完了です。

 

crontabコマンドのman結果

最後に「man 5 crontab」のコマンド結果を記載します。

(私もしばしば目を通しています)

$ man 5 crontab | col -b
CRONTAB(5)                        File Formats Manual                       CRONTAB(5)


       crontab - cron を駆動するための一覧表


       crontab            ファイルには            cron(8)           デーモンへの命令が
       「この日付のこの時刻にこのコマンドを使用せよ」   という形式で書き込まれている。
       ユーザはそれぞれ自分用の       crontab      を持っており、      各      crontab
       に与えられたコマンドは、                      その                      crontab
       を所有しているユーザの権限で実行されることになる。       UUCP      や      News
       はたいていそれぞれの crontab  を持っているので、  cron  コマンドの一部で  su(1)
       を明示的に実行する必要性はない。

       空行および行頭のスペース・タブは無視される。     行先頭の空白以外の文字が     #
       の行はコメント行であり、無視される。                                       cron
       コマンドとしての行に注釈としてのコメントを入れることはできない。
       それらはコマンドの一部とみなされてしまう。
       同様に、環境変数を設定している行にコメントを入れることはできない。

       crontab     の動作行は、     環境変数の設定か    cronコマンドのいずれかである。
       環境変数の設定は以下の形式をとる:

           name = value

       ただし、等号 (=)  両側のスペースはなくても良い。  value  内部の  (先頭ではない)
       スペース文字は、値の一部として         name         に与えられる。        value
       文字列は引用符で括ってもよい    (シングルクォートでもダブルクォートでも良いが、
       揃っている必要がある)。 こうすれば先頭や末尾の空白を値に渡すことができる。

       いくつかの環境変数は   cron(8)  デーモンによって自動的に設定される。  SHELL  は
       /bin/sh   に設定され、   LOGNAME   とHOME    は    /etc/passwd    の    crontab
       の所有者の行から設定される。  HOME と SHELL は crontab 内部の記述で変更できる。
       LOGNAME は変更できない。

       (さらに注意:LOGNAME  変数は、  BSD   システムではまれに   USER   と称される...
       これらのシステム上では  USER  も設定される。)  LOGNAME,  HOME,  SHELL  の他に、
       cron(8) は「この」crontab  を実行した結果メールを送る必要が生じた場合、  MAILTO
       も参照する。      もしMAILTOが定義されていたら     (およびそれが空でなかったら)
       その名前のユーザーにメールを送る。                                       MAILTO
       が定義されていても値が設定されていなければ (MAILTO="")、 メールは送信されない。
       MAILTO  が定義もされていなければ、メールは  crontab  の所有者に送られる。  cron
       をインストールする際に、メーラーを    /usr/lib/sendmail    ではなく   /bin/mail
       にしていると、このオプションは便利である。
       /bin/mailはエイリアシングを行わないし、                                    UUCP
       はたいていこのメールを読まないからである。

       cron コマンドの形式は  V7  標準そのものであるが、  多くの上位互換な拡張がある。
       各行には 5 つの時刻・日付フィールドがあり、 (システムの crontab ファイルの場合)
       ユーザー名が続き、 さらにコマンドが続く。 分・時・月が現在時刻と一致し、 かつ、
       2    つの日フィールド    (月内日または曜日)    のいずれかが現在時刻と一致すれば
       (以下の「注意」を参照)、  コマンドが   cron(8)   によって実行される。   cron(8)
       は毎分に一度 cron エントリを調べる。 時間と日付フィールドは以下の通り:

              フィールド 指定可能な値
              ---------- --------------
              分         0-59
              時         0-23
              月内日     1-31
              月         1-12 (もしくは名前。下記を参照)
              曜日       0-7 (0 と 7 は日曜日。もしくは名前)

       フィールドにはアスタリスク    (*)   も指定できる。   これはあらゆるフィールドで
       ``first-last'' という意味になる。

       数値の範囲も指定できる。範囲は二つの数をハイフンでつなげる。
       指定数値も領域に含まれる。例えば「時」に  8-11  を指定すると、  8時, 9時, 10時,
       11時に実行することになる。

       リストもできる。リストはコンマで区切られた数値  (または範囲)   のセットである。
       例:``1,2,5,9'', ``0-4,8-12''

       間隔値を範囲とともに指定することもできる。       範囲の後に       ``/<number>''
       と指定すると、 範囲内で指定数値ずつ飛ばすことになる。  例えば「時」フィールドに
       ``0-23/2''     と指定すると、    コマンドは    2    時間おきに実行される    (V7
       標準の別形式で書けば                        ``0,2,4,6,8,10,12,14,16,18,20,22'')
       間隔はアスタリスクの後にも指定できる。「2              時間おき」といいたければ
       ``*/2''とする。

       「月」フィールドや「曜日」フィールドには名前を使用することもできる。
       その日または月の最初の3文字を用いる                  (大文字小文字は問わない)。
       範囲やリストを名前に対して用いることはできない。

       「第    6」フィールド    (行の残りの部分)    には実行されるコマンドを指定する。
       その行のコマンド部  (改行文字または  % 文字まで) が /bin/sh (またはその crontab
       ファイルの     SHELL      環境変数で指定されたシェル)      によって実行される。
       コマンド中にパーセント記号        (%)       が       バックスラッシュ       (\)
       によってエスケープされずに置かれていると、 改行文字に置き換えられ、最初に現れた
       % 以降の全てのデータは 標準入力としてコマンドに送られる。

       注意:       コマンド実行の日は       2       つのフィールドで指定できる       ―
       月内日および曜日である。  もし両方のフィールドが制限指定  (*  以外)  であると、
       いずれかのフィールドが現在時刻と合った時にコマンドが実行される。 例えば、
       ``30 4 1,15 * 5''
       とすると、毎月     1     日と     15     日および毎週金曜日の     午前     4:30
       にコマンドが実行される。

CRON フ
       # (/etc/passwd の指定に関らず) コマンド実行に /bin/sh を使用する。
       SHELL=/bin/sh
       # (この crontab の所有者に関らず) あらゆる出力を `paul' にメールする。
       MAILTO=paul
       #
       # 毎日、日付変更の 5 分後に実行する
       5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
       # 毎月初日の 2:15pm に実行する -- 出力は paul にメールされる
       15 14 1 * *     $HOME/bin/monthly
       # 平日の午後 10 時に実行してジョーを心配させる
       0 22 * * 1-5 mail -s "午後10時だ" joe%ジョー、%%お前の子どもはどこだい?%
       23 0-23/2 * * * echo "毎日 0,2,4..時 23 分に実行する"
       5 4 * * sun     echo "日曜 4 時 5 分に実行する"


       cron(8), crontab(1)


       曜日指定において、   0    も    7    も日曜日とみなされる。    BSD    と    ATT
       ではこのようにはなっていないようだ。

       リストと範囲は同じフィールドに共存できる。  ATT  や  BSD の cron では "1-3,7-9"
       は拒否されるだろう -- "1-3" または "7,8,9" のいずれかだけしか指定できない。

       範囲に「間隔値」を指定できる。すなわち "1-9/2" が "1,3,5,7,9" と同じ。

       月または曜日を名前で指定できる。

       環境変数を      crontab       の内部で設定できる。       BSD       や       ATT
       では、子プロセスに渡される環境は基本的に /etc/rc のものである。

       コマンドの出力は crontab の所有者にメールされる (BSD ではこれを行わない)。 また
       crontab    の所有者以外の人にもメールできる     (SysV     ではこれができない)。
       さらにこの機能を無効にし、      誰にもメールを送らないようにもできる      (SysV
       ではこれもできない)。


       Paul Vixie <paul@vix.com>

4th Berkeley Distribution           24 January 1994                         CRONTAB(5)

Posted by 100%レンタルサーバーを使いこなすサイト管理人

コメントを残す

メールアドレスが公開されることはありません。