cronとは何か?
Linuxやmac osで使われる常駐プログラムの一つで、ジョブのスケジューリングができる便利な機能。
常駐プログラム(デーモン)の名前はcrond。
コマンドはcrontab
。
ちなみにPCがシャットダウンするとcrondも立ち下がるので、この時ジョブは実行されない。エラーログも残らない。
crontabコマンドの使い方
$ crontab -e
オプションで「-e」をつけると、vimエディタが起動する。
ここに、実行したいタイミングと処理を記述する。
初期は何も記述されていない。
実行タイミングの指定方法
数値(英語)で指定
ジョブの指定方法はスケジュールに関する5つの項目と、実行するジョブの6つから成る。
分 時 日 月 曜日 実行するジョブ
項目 | 使える値 |
---|---|
分 | 0~59 |
時 | 0~23 |
日 | 1~31 |
月 | 1~12 or jan~dec |
曜日 | 0~7 or sun~sat |
曜日は日曜日始まり。※日曜日は2つある。(0:sunday, 1:monday、〜、5:friday, 7:sunday)
ワイルドカード(*)
アスタリスクはワイルドカードとして、値を指定しない場合に用いる。(最もよく使う)
例えば * が5つ並ぶ場合は処理を毎分実行することを示す。
#毎分
* * * * * 実行するジョブ
#毎日19:10分
10 19 * * * 実行するジョブ
#金曜日の19:10分
10 19 * * 5 実行するジョブ
書き方
書き方もいくつかある。
| 書式 | 例 | 説明 |
書式 | 例 | 説明 |
---|---|---|
リスト | 0,15,30 | 複数の値をピンポイントで指定。分の場合、0分、15分、30分を指定したことになる。 |
範囲 | 1-5 | 範囲で指定。分なら1〜5分。曜日なら月曜〜金曜日となる。 |
共存 | 1,5,10-20 | リストと範囲を合わせて記述できる。 |
間隔値 | */10 | 〇〇毎の設定ができる。分の場合は10分毎となる |
間隔値 | 1-5/2 | 母数を用いることで、1,3,5のように指定ができる |
#3分毎
*/3 * * * * 実行するジョブ
#月〜金曜日の19:10分
10 19 * * 1-5 実行するジョブ
#9~12月の、1日と15日の6時、12時、18時、24時
0 */6 1,15 9-12 * 実行するジョブ
混乱したときはWEBサイトcrontab.guruを使うとわかりやすい。
コピペで貼り付けたり、手入力で数値を変えることができる。
タイムスタンプで指定
冒頭に「@(アットマーク)」をつけた文字列で指定することもできます。cronでは「@~」をタイムスタンプと呼びます。
タイムスタンプ | 内容 | 類似指定 |
---|---|---|
@yearly | 毎年 | 0 0 1 1 * |
@monthly | 毎月 | 0 0 1 * * |
@weekly | 毎週 | 0 0 * * 1 |
@daily | 毎日 | 0 0 * * * * |
@hourly | 毎時 | 0 * * * * |
@reboot | リブート毎 | なし。スタートアップとして実行 |
コマンドの書き方
コマンドの書き方はいくつかあります。
- コマンドのみ記述
- 出力先ファイルを指定
- シェルスクリプトを指定
(1)コマンドのみ記述
コマンドのみ記述すると、実行結果をmailで送付してくれる。
デフォルト設定のmailは 「/var/mail/ユーザー名」のファイルに追記される。
#hello worldを出力
* * * * * echo "hello world"
#ファイルサイズを出力
* * * * * df -h
出力結果(mail)の確認
指定時間を経過するとバッシュに下記が表示される。
中身はテキスト。記述量が多いので、最後に実行されたコマンドのみ見るためにtailコマンドを使う。
You have mail in /var/mail/ユーザー名
#該当ファイルに記述された最後の入力項目のみ表示
$ tail /var/mail/ユーザー名
#df-hコマンドの出力結果例
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/disk1s2 466Gi 10Gi 412Gi 3% 488282 4881964598 0% /
devfs 195Ki 195Ki 0Bi 100% 676 0 100% /dev
/dev/disk1s1 466Gi 39Gi 412Gi 9% 788087 4881664793 0% /System/Volumes/Data
/dev/disk1s5 466Gi 3.0Gi 412Gi 1% 3 4882452877 0% /private/var/vm
map auto_home 0Bi 0Bi 0Bi 100% 0 0 100% /System/Volumes/Data/home
map -fstab 0Bi 0Bi 0Bi 100% 0 0 100% /System/Volumes/Data/Network/Servers
・tail -f ファイルパス
ファイルの最終行から数行を出力するコマンド。デフォルトでは10行分を表示。
「-f」オプションで追記分だけ表示する。
全文見たければcatかcode (vs codeで開く)など。
mail宛先の変更
メールアドレスを変更することも可能。
MAILTO = "メールアドレス"
<補足>
gmailアドレス指定してみましたが、確かにメール送信トライしているものの、timeoutで実行されていない状態でした、、
$ mailq
1BF912A90BB 1142 Thu Sep 10 19:27:00 XXXX.localdomain
(connect to 1BF912A90BB 1142 Thu Sep 10 19:27:00alt2.aspmx.l.google.com[201.84.143.27]:25: Operation timed out)
YYYY@gmail.com
(2)出力先ファイルを指定
コマンドを実行してファイルに書き出すことも可能。
コマンド >> 出力先ファイルパス
#hello worldをdesktopのhello.txtに出力(2分毎)
*/2 * * * * echo "hello world" >> ~/desktop/hello.txt
指定したファイルがない場合は作成してくれる。
(3)シェルスクリプトを指定
実行コマンドを記述したシェルスクリプトを指定することも可能。
シェルスクリプトを実行する場合はいくつか手順を踏む必要がある。
- crontab -e でシェルスクリプトのフルパスを記述
- 指定したパスにシェルスクリプトを作成しコマンドを記述
- シェルスクリプトに実行コマンドを付与
- macの環境設定のフルディスクアクセスにcronを許可する(Mac OSの場合)
cronコマンドの例
#毎週土曜日の00:05にシェルスクリプトを実行する
0 5 * * 6 ~/desktop/abc.sh
シェルスクリプトの記述例
#デスクトップにtest.txtを作成する
touch ~/desktop/test.txt
#tmpディレクトリ配下を一掃する
rm -rf /tmp/*
crontabのオプション
crontabは珍しくオプションの数が少ないコマンド。
・crontab -e
: cron設定のエディタを開く
・crontab -l
: cron設定のエディタの内容を出力する
・crontab -r
: cron設定のエディタ内容を全消去する
「-e」と「-l」はよく使う。
cronでよく使われる記号
出力先指定(上書き)「>」
標準出力(bashでの実行結果)を指定したファイルに出力する。
ファイルがなければ自動で新規作成。
既存ファイルがある場合は上書きされる。
#hello worldをdesktopのhello.txtに出力
#hello.txtの中身は常にhello worldのみ(上書き)
echo "hello world" > ~/desktop/hello.txt
ちなみに、「>」はリダイレクトと呼ぶ。
出力先指定(追記)「>>」
標準出力(bashでの実行結果)を指定したファイルに出力する。
「>」と異なり、出力結果を追記する。
(元の内容を削除せず、記述がどんどん増えていく)
#hello worldをdesktopのhello.txtに出力
#実行回数毎にhello worldが増える
echo "hello world" >> ~/desktop/hello.txt
標準出力とは?
標準出力とは、画面への出力内容のこと。
バッシュ(黒画面)でコマンドを入力し、返ってきた結果が標準出力。
関連ワードに、標準入力と標準エラー出力がある。
項目 | 英語表記 | 内容 | 番号 |
---|---|---|---|
標準入力 | Standard Input | 入力コマンド | 0 |
標準出力 | Standard Output | コマンドの実行結果 | 1 |
標準エラー出力 | Standard Errot | コマンド実行結果がエラーの場合の出力 | 2 |
2>&1
たまに見かけるコマンドの末尾に書かれた「2>&1」。
意味は、コマンド結果がエラーの場合も、エラー内容を表示する。
上の表の右端にサラッと番号を記述したが、各の番号がそれに当たる。
▼「2>&1」のそれぞれの意味
項目 | 内容 |
---|---|
2 | 標準エラー出力 |
>& | 出力先を指定してマージ |
1 | 標準出力 |
つまり、標準エラー出力を標準出力として表示する指令。
#hello worldをdesktopのhello.txtに出力
#エラーが発生した場合は、エラー内容を記述
echo "hello world" >> ~/desktop/hello.txt 2>&1