cron(クローン)コマンドとは何か?使い方や実行タイミングの指定方法を実例で解説|処理をスケジューリングし自動で実行する方法(>,>>,2>&1)

windows-terminal-prograshi(プロぐらし)-kv Command
記事内に広告が含まれていることがあります。

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. コマンドのみ記述
  2. 出力先ファイルを指定
  3. シェルスクリプトを指定


(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)シェルスクリプトを指定

実行コマンドを記述したシェルスクリプトを指定することも可能。
シェルスクリプトを実行する場合はいくつか手順を踏む必要がある。

  1. crontab -e でシェルスクリプトのフルパスを記述
  2. 指定したパスにシェルスクリプトを作成しコマンドを記述
  3. シェルスクリプトに実行コマンドを付与
  4. macの環境設定のフルディスクアクセスにcronを許可する(Mac OSの場合)

crontabコマンドでシェルスクリプトを実行する手順


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
タイトルとURLをコピーしました