# Crontab コマンドの説明

Cron デーモン（crond）は Unix 系オペレーティングシステム上のバックグラウンドサービスで、スケジュールされたコマンドを実行します。crontab（cron テーブル）ファイルから設定を読み取り、各コマンドの実行時期と頻度を定義します。

## 構文

crontab コマンドはユーザーごとの crontab ファイルを管理します：

```
crontab [-u user] [-l | -r | -e | -i] [file]
```

## オプション

- **`-e`**: デフォルトエディター（$VISUAL または $EDITOR）で現在のユーザーの crontab を編集します。エディター終了後に新しい crontab がインストールされます。
- **`-l`**: 現在のユーザーの crontab を標準出力に表示します。
- **`-r`**: 現在のユーザーの crontab を完全に削除します。
- **`-i`**: 削除前に確認を求めます（-r と併用）。
- **`-u user`**: 自分の crontab ではなく、指定したユーザーの crontab を操作します。root 権限が必要です。
- **`file`**: 指定されたファイルから crontab をインストールします。標準入力の場合は - を使用します。

## Crontab ファイル形式

crontab ファイルの各行は、環境変数の代入、コメント（# で始まる）、または以下の形式の cron ジョブのいずれかです：

```
┌───────────── 分 (0–59)
│ ┌───────────── 時 (0–23)
│ │ ┌───────────── 日 (1–31)
│ │ │ ┌───────────── 月 (1–12 または JAN–DEC)
│ │ │ │ ┌───────────── 曜日 (0–6 または SUN–SAT)
│ │ │ │ │
* * * * *  実行するコマンド
```

## フィールド演算子

- *** (asterisk)**: そのフィールドのすべての値に一致します。
- **, (comma)**: 値のリストを指定します。例：日フィールドの 1,15 は1日と15日を意味します。
- **- (hyphen)**: 包含範囲を定義します。例：時フィールドの 9-17 は9時から17時までの毎時を意味します。
- **/ (slash)**: ステップを定義します。例：分フィールドの */10 は10分ごとを意味します。範囲と組み合わせることもできます：1-30/5。

## 特殊文字列

5つの時間フィールドの代わりに、以下の省略文字列のいずれかを使用できます：

| String | Equivalent |
|--------|-----------|
| `@yearly` / `@annually` | `0 0 1 1 *` |
| `@monthly` | `0 0 1 * *` |
| `@weekly` | `0 0 * * 0` |
| `@daily` / `@midnight` | `0 0 * * *` |
| `@hourly` | `0 * * * *` |
| `@reboot` | `Run once at startup` |

## 環境変数

crontab ファイルの先頭で環境変数を設定できます。最も一般的なもの：

- **SHELL**: コマンドの実行に使用されるシェル（デフォルト：/bin/sh）。
- **PATH**: コマンドの検索パス。Cron のデフォルト PATH は最小限（通常 /usr/bin:/bin）のため、常に絶対パスを使用するか PATH を明示的に設定してください。
- **MAILTO**: コマンド出力の送信先。"" に設定するとメール送信を抑制します。デフォルトでは、出力は crontab の所有者にメールで送信されます。
- **CRON_TZ**: crontab のタイムゾーンを設定します（すべてのシステムでサポートされているわけではありません）。設定しない場合、cron はシステムのタイムゾーンを使用します。

```
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com

*/5 * * * * /home/user/scripts/backup.sh
```

## システム crontab とユーザー crontab

ユーザー crontab（crontab -e で編集）は5つの時間フィールドとコマンドで構成されます。システム crontab（/etc/crontab）と /etc/cron.d/ 内のファイルは、時間フィールドとコマンドの間にコマンドを実行するユーザー名という追加フィールドがあります。

システム crontab の例：

```
# /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m  h  dom mon dow user    command
*/15 *  *   *   *   root    /usr/local/bin/system-check.sh
0    2  *   *   *   backup  /usr/local/bin/nightly-backup.sh
```

## よくある落とし穴

### % (percent sign)

パーセント記号（%）は crontab で特別な意味を持ちます：改行に変換され、最初の % 以降のすべてがコマンドの標準入力として送信されます。リテラルの % を使用するには \% とエスケープしてください。

```
# Wrong — the % will be interpreted
0 0 * * * echo "Date: $(date +%Y-%m-%d)"

# Correct — escape the %
0 0 * * * echo "Date: $(date +\%Y-\%m-\%d)"
```

### PATH

Cron は最小限の PATH で実行されます。/usr/local/bin やその他のディレクトリのコマンドに依存するスクリプトは、絶対パスを使用するか crontab の先頭で PATH を設定してください。

### Day-of-month + day-of-week

日（day-of-month）と曜日（day-of-week）の両方が制限されている場合（* でない場合）、cron はいずれかのフィールドが一致した時にコマンドを実行します（OR 論理）。例えば、0 0 1 * 5 は毎月1日の深夜0時と毎週金曜日に実行されます。

### Timezone

Cron はデフォルトでシステムのタイムゾーンを使用します。サーバーが UTC でもローカルタイムゾーンでジョブを実行したい場合は、CRON_TZ（サポートされている場合）を使用するか手動で時間を変換してください。

### Output and logging

デフォルトでは、cron はすべての出力（stdout と stderr）を crontab の所有者にメールで送信します。ジョブを無音にするには、出力をリダイレクトします：command > /dev/null 2>&1。出力をログに記録するにはファイルにリダイレクト：command >> /var/log/myjob.log 2>&1。

```
# Discard all output
*/5 * * * * /path/to/script.sh > /dev/null 2>&1

# Log output to a file
*/5 * * * * /path/to/script.sh >> /var/log/myscript.log 2>&1
```

## 実用的な例

- [`*/5 * * * *`](https://crontab.run/ja/every-5-minutes) — run every 5 minutes
- [`0 0 * * *`](https://crontab.run/ja/daily) — run once a day at midnight
- [`0 9 * * 1-5`](https://crontab.run/ja/every-weekday-at-9am) — run at 9 AM on weekdays
- [`0 0 1 * *`](https://crontab.run/ja/every-month) — run at midnight on the 1st of every month
- [`0 0 * * 0`](https://crontab.run/ja/every-sunday) — run at midnight every Sunday

Canonical: https://crontab.run/ja/command

---

Maintained by Jsmon — https://jsmon.sh
