Linuxの定時実行タスク crontab

📢 この記事は gemini-3-flash-preview によって翻訳されました

この記事、結構前に書いたやつだから、書き方のクセが今と違ってて自分でもちょっと違和感あるかも

crontabコマンドを使うと、決まった時間の間隔で特定のシステムコマンドやshellスクリプトを実行できるんだ。時間の間隔は、分、時、日、月、曜日、それらの組み合わせで自由に設定できるよ。

コマンドの形式

1
crontab [-u user] file crontab [-u user] [ -e | -l | -r ]

コマンドの引数

  • -u user:特定のユーザーのcrontabサービスを設定するために使う。
  • file:コマンドファイルの名前。このファイルをcrontabのタスクリストとして読み込む。コマンドラインで指定しない場合は、標準入力(キーボード)からの入力を受け取ってcrontabに読み込むよ。
  • -e:特定のユーザーのcrontabファイルの内容を編集する。ユーザーを指定しない場合は、現在のユーザーのファイルを編集するよ。
  • -l:特定のユーザーのcrontabファイルの内容を表示する。指定しない場合は現在のユーザーのものを表示するよ。
  • -r:/var/spool/cron ディレクトリから特定のユーザーのcrontabファイルを削除する。指定しない場合は現在のユーザーのものが削除されるよ。
  • -i:crontabファイルを削除する時に確認プロンプトを出す。

ファイル形式

crontab -e コマンドを実行すると、現在のユーザーの crontab ファイルが開くよ。このファイルの中で、# で始まる行はコメントになるんだ。

crontab ファイルでは、m h dom mon dow command という6つのフィールドで定時タスクを設定するよ。1行が1つのタスクに対応してるんだ。それぞれの意味はこんな感じ:

  • m:分 (minute) 1時間の中の何分目に実行するか。範囲は 0-59。

  • h:時 (hour) 1日の中の何時目に実行するか。範囲は 0-23。

  • dom:日 (day of month) 1ヶ月の中の何日目に実行するか。範囲は 0-31。

  • mon:月 (month) 1年の中の何ヶ月目に実行するか。範囲は 1-12。 月の英語名の最初の3文字で指定することもできるよ(大文字小文字は区別しない)。例えば january なら jan で指定可能。

  • dow:曜日 (day of week) 1週間の中の何曜日に実行するか。範囲は 0-7 で、0 と 7 はどちらも日曜日。 これも英語名の最初の3文字で指定できるよ(例:monday なら mon)。

  • command:具体的な操作

    実行したい具体的なコマンドや、実行したいスクリプトのパスを指定するよ。

    これら6つのフィールドはスペースで区切る必要があるんだ。すべてのフィールドに値を設定しなきゃいけなくて、省略はできないよ。5番目のフィールドより後の内容は、すべて6番目のフィールド(実行する操作)として扱われるんだ。


最初の5つのフィールドでは、以下の特殊文字を使って時間を指定できるよ:

  • アスタリスク(*):すべての可能な値を表す。例えば、月フィールドがアスタリスクなら、他の条件が合えば毎月実行されるよ。
  • カンマ(,):カンマで区切ってリストで指定できる。例えば、“1,2,5,7,8,9” みたいにね。
  • ハイフン(-):整数をハイフンで繋いで範囲を指定できる。例えば “2-6” は “2,3,4,5,6” と同じ意味。
  • スラッシュ(/):時間の**間隔(頻度)**を指定できる。例えば “0-23/2” は2時間ごとに実行。アスタリスクと組み合わせて */10 と書けば、分フィールドなら10分ごとに実行っていう意味になるよ。

command フィールドでは、改行文字や % 文字を使ってコマンド内容を区切ることができるんだ。

最初の % より前の内容は実行のために shell に渡されて、% 自体は改行に置き換わるよ。% 以降、行末までの内容は標準入力として渡されるんだ。

もし % 文字そのものを使いたい時は、\% でエスケープしてね。

よく使う方法

cronプロセスにcrontabファイルを渡す前に、まずは環境変数 EDITOR を設定しておこう。cronはこの変数を見て、どのエディタでcrontabファイルを編集するか決めるんだ。

デフォルトの nano エディタが使いにくい場合は、vi に変更できるよ。$HOME ディレクトリの .profile ファイルを編集して、こんな一行を追加してみて:

1
EDITOR=vi; export EDITOR

保存して終了したら準備OK。例えば <user>cron(ユーザー名が yexca なら yexcacron)っていう名前のファイルを作って、そこに実行したい内容を書いてみよう。

1
2
# 午後6時から午前6時まで、15分ごとに日付をコンソールに表示する
0,15,30,45 18-06 * * * /bin/echo 'date' > /dev/console

この例では、15分ごとに現在の時刻がコンソールに出力されるよ。システムがクラッシュしたり止まったりした時に、最後に表示された時間を見ればいつ止まったかすぐ分かるんだ。システムによっては tty1 がコンソールになってることもあるから、環境に合わせて適宜書き換えてね。作ったファイルを登録するには、そのファイルを引数にして crontab コマンドを実行すればいいよ:

1
crontab yexcacron

これで cron プロセスに登録されて、15分ごとに実行されるようになるんだ。同時に、このファイルのコピーが /var/spool/cron ディレクトリにユーザー名(この場合は yexca)で保存されるよ。

スクリプトの実行

スクリプトを実行する時に環境変数を使いたい場合は、こんな感じで書くよ:

1
30 6 * * * . /etc/profile;/bin/sh /root/zfile/bin/restart.sh

これは毎日 6:30 に zfile の restart.sh を実行する設定だね。

参考記事

crontab 定时任务 — Linux Tools Quick Tutorial

Linux技巧:介绍设置定时周期执行任务的方法 - SegmentFault 思否

Linux命令之Crontab——定时任务 - SegmentFault 思否

nano编辑器使用教程 - VPS侦探

Linux vi/vim - 菜鸟教程

This post is licensed under CC BY-NC-SA 4.0 by the author.

Visits Since 2025-02-28

Hugo で構築されています。 | テーマ StackJimmy によって設計されています。