編集の要約なし
 
(同じ利用者による、間の6版が非表示)
15行目: 15行目:
  # |  |  |  |  |
  # |  |  |  |  |
  # *  *  *  *  *  username  command-to-be-executed
  # *  *  *  *  *  username  command-to-be-executed
<br><br>
== Cronの仕組み ==
crontabファイルを編集してCronの設定を変更した場合、変更内容は即座に反映される。<br>
LinuxおよびCronサービスの再起動は不要である。<br>
<br>
Cronは、以下に示すような仕組みで動作する。<br>
# Cronデーモンが常に動作しており、1分ごとにcrontabファイルを確認する。
# crontabファイルが変更されている場合、Cronデーモンはその内容を読み込み、新しいスケジュールに基づいてジョブを実行する。
# したがって、crontabファイルを保存した時点で、次の1分以内に新しい設定が有効になる。
<br>
ただし、以下の点に注意が必要である。<br>
* crontabコマンドで編集を行った場合は自動的に認識されるが、直接crontabファイルを編集した場合は、編集後にCronデーモンにリロードを指示するためのコマンドの実行が推奨される。
*: <code>sudo systemctl reload cron</code>
* crontabファイルにシンタックスエラーがある場合、Cronデーモンはそのファイルを読み込まないため、編集内容が反映されない。
<br>
したがって、多くの場合は、Cronの設定変更は即座に反映されますが、確実を期すためには編集後に再読み込みを行うことが望ましいと言える。<br>
特に、Cronにシンタックスエラーがあると反映されないため、設定後はジョブが意図通り動作するかどうかを確認する。<br>
<br><br>
<br><br>


34行目: 52行目:
<br>
<br>
===== コマンドで設定 crontab -e =====
===== コマンドで設定 crontab -e =====
ターミナルにて、以下のコマンドを実行する。<br>
ユーザを指定しない場合、実行したユーザのcrontabが操作対象となる。<br>
ユーザを指定しない場合、実行したユーザのcrontabが操作対象となる。<br>
rootユーザの場合、-uオプションで指定したユーザのcrontabを設定したり、内容を確認することが出来る。<br>
rootユーザの場合、-uオプションで指定したユーザのcrontabを設定したり、内容を確認することが出来る。<br>
40行目: 57行目:
<br>
<br>
<u>'''設定例'''</u><br>
<u>'''設定例'''</u><br>
毎時00分にtest.shスクリプトを実行させる設定である。<br>
以下の例は、毎時00分にtest.shスクリプトを実行させる設定である。<br>
設定内容は、/var/spool/cron/<ユーザ名>ファイルに保存される。(パーミッションの関係でrootユーザのみ内容を確認できる)<br>
設定内容は、/var/spool/cron/<ユーザ名>ファイルに保存される。(パーミッションの関係で、rootユーザのみ内容を確認できる)<br>
# 例 1
  00 * * * * /usr/local/bin/test.sh
  00 * * * * /usr/local/bin/test.sh
<br>
以下の例は、毎日6時15分にtest.shスクリプトを実行させる設定である。<br>
# 例 2
15 6 * * * /home/<ユーザ名>/test.sh
<br>
<br>
<u>'''オプション'''</u><br>
<u>'''オプション'''</u><br>
crontabを操作する際によく使用されるオプションを記載する。<br>
crontabを操作する際によく使用されるオプションを記載する。<br>
<center>
<center>
{| class="wikitable"
{| class="wikitable"| style="background-color:#fefefe;"  
|-
|-
! オプション !! 説明 !! コマンド実行例
! style="background-color:#66CCFF;" | オプション  
! style="background-color:#66CCFF;" | 説明  
! style="background-color:#66CCFF;" | コマンド実行例
|-
|-
| -u <ユーザ名> || ユーザを指定してcrontabを実行する。(rootユーザのみ使用可能)<br>省略した場合、crontabコマンドを実行したユーザで設定される。 || crontab -u <ユーザ名> -l
| -u <ユーザ名> || ユーザを指定してcrontabを実行する。(rootユーザのみ使用可能)<br>省略した場合、crontabコマンドを実行したユーザで設定される。 || <code>crontab -u <ユーザ名> -l</code>
|-
|-
| -l || crontabの設定内容を表示する。 || crontab -l
| -l || crontabの設定内容を表示する。 || <code>crontab -l</code>
|-
|-
| -e || crontabの設定を行う。<br><u>'''設定を削除する[r]キーと隣り合わせなので注意すること。'''</u> || crontab -e
| -e || crontabの設定を行う。<br><u>'''設定を削除する[r]キーと隣り合わせなので注意すること。'''</u> || <code>crontab -e</code>
|-
|-
| -r || crontabの設定を削除する。<br>削除の確認メッセージは無く、全ての設定が削除されるので注意すること。 || crontab -r
| -r || crontabの設定を削除する。<br>削除の確認メッセージは無く、全ての設定が削除されるので注意すること。 || <code>crontab -r</code>
|-
|-
| -i || -rオプションと一緒に使用するとき、設定削除の確認メッセージが表示がされ、[y]または[Y]キーを押下することで設定が削除される。 || crontab -ir
| -i || -rオプションと一緒に使用するとき、設定削除の確認メッセージが表示がされ、[y]または[Y]キーを押下することで設定が削除される。 || <code>crontab -ir</code>
|}
|}
</center>
</center>
181行目: 205行目:
<br><br>
<br><br>


== crontabのTips ==
===== cronで月末を指定 =====
cron(crontab)で月末で指定する方法<br>
毎月28~31日の間に「test」コマンドで月末かどうかを判定する。<br>
$( date --date '+1 day' +\%d )  # 1日後は何日かを求めて変数へ格納する
<br>
または、testコマンドで1日後が1日であれば(-eq 1)、月末あると判定する。<br>
55 23 28-31 * * /usr/bin/test $( date --date '+1 day' +\%d ) -eq 1 && 実行コマンド
<br>
===== 最終金曜日のみ実行 =====
毎週金曜日にtestコマンドで最終金曜日の判定を行う。<br>
0 0 * * 5  # 金曜日の0時0分をスケジュール
$( date +\%m )  # 今日は何月かを求めて変数に格納する
$( date --date '7 day' +\%m )  # 7日後は何月かを求めて変数に格納する
<br>
当日の月と7日後が何月なのかをtestコマンドで比較して、値が異なる(-ne)場合は、最終金曜日であると判断する。<br>
金曜日以外の判定を行いたい場合は、曜日を指定するフィールドを適宜変更する。<br>
0 0 * * 5 /usr/bin/test $( date +\%m ) -ne $( date --date '7 day' +\%m ) && 実行コマンド'
<br>
===== メールを送信しない場合 =====
cron実行後の結果をメールで送信させない場合は、cron設定の前に以下の行を入力することで、メールが送信されなくなる。<br>
複数のアドレスにメールを送信する時は、カンマ区切りで複数メールアドレスを指定する。($MAILTO変数は、デフォルトのメールアドレスを上書きする)<br>
MAILTO=""
<br>
特定のスケジュールのみメールの宛先を変更する場合は、次のように指定する。<br>
crontab -e
0 2 * * * 実行コマンド 2>&1 | Mail [送信先メールアドレス]
<br>
===== 再起動時に実行する =====
@rebootと指定することで、再起動時に何かの処理を実行することが出来る。<br>
@reboot 実行コマンド
<br>
===== サーバ起動後に任意の時間経過後に実行する =====
sleepコマンドと組み合わせる。<br>
その他の方法としては、実行する処理をシェルスクリプト等で作成して、最初にsleepコマンドで実行を待機する方法もある。<br>
@reboot sleep 600; 実行コマンド
<br>
===== 秒単位の設定 =====
crontabの標準の設定では、秒単位での指定はできないが、下記のように記述すると秒単位で実行することが出来る。<br>
<br>
毎分10秒にコマンドを実行する。<br>
* * * * * sleep 10; 実行コマンド
<br>
毎分30秒にコマンドを実行する。<br>
* * * * * sleep 30; 実行コマンド
<br>
決まった秒数の間隔で実行する。この方法は、sleepコマンドで待機させる時間をずらして、複数行に分けて記述する。<br>
ただし、この方法では、1秒ごとにコマンドを実行させたい場合、60行記述する必要があるので非推奨である。<br>
* * * * * 実行コマンド
* * * * * sleep 10; 実行コマンド
* * * * * sleep 20; 実行コマンド
* * * * * sleep 30; 実行コマンド
* * * * * sleep 40; 実行コマンド
* * * * * sleep 50; 実行コマンド
<br>
===== for文を使用 =====
for文を使用することで、1行で秒指定を行うことが出来る。<br>
<秒間隔>の部分にsleepさせたい秒数を設定する。<br>
* * * * * for i in `seq 0 <秒間隔> 59`;do (sleep ${i} ; 実行コマンド) & done;
<br>
例えば、10秒毎に実行する場合は、下記の通りになる。<br>
* * * * * for i in `seq 0 10 59`;do (sleep ${i} ; 実行コマンド) & done;
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]]
[[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]]