# Cron クイックリファレンス

*ジョブスケジューリング、crontab 構文、特殊文字列、ログ*

> Source: crontab(5) Manual Page · MIT

## 構文

### Crontab の形式

```
# ┌───── minute (0-59)
# │ ┌───── hour (0-23)
# │ │ ┌───── day of month (1-31)
# │ │ │ ┌───── month (1-12)
# │ │ │ │ ┌───── day of week (0-7, 0&7=Sun)
# * * * * * command
```

### フィールドの値

| Command | Description |
|---------|-------------|
| `*` | 任意の値（ワイルドカード） |
| `,` | 値のリスト: `1,3,5` |
| `-` | 範囲: `1-5` |
| `/` | ステップ: `*/10`（10ごと） |
| `0-59` | 分の範囲 |
| `0-23` | 時の範囲 |
| `1-31` | 日の範囲 |
| `1-12` | 月の範囲（または JAN-DEC） |
| `0-7` | 曜日（0&7=日曜、または SUN-SAT） |

## 特殊文字列

### スケジールの略記

| Command | Description |
|---------|-------------|
| `@reboot` | 起動時に1回実行 |
| `@yearly` | `0 0 1 1 *` — 年1回（1月1日） |
| `@monthly` | `0 0 1 * *` — 月1回（1日） |
| `@weekly` | `0 0 * * 0` — 週1回（日曜日） |
| `@daily` | `0 0 * * *` — 日1回（深夜0時） |
| `@hourly` | `0 * * * *` — 1時間に1回 |

## 例

### よく使うスケジュール

```
30 2 * * *   /usr/local/bin/backup.sh
0 9 * * 1-5  /opt/report.sh
*/15 * * * *  /usr/bin/health-check.sh
0 0 1 * *    /opt/monthly-cleanup.sh
0 8,17 * * * /opt/notify.sh
```

### スケジュールの解説

| Command | Description |
|---------|-------------|
| `30 2 * * *` | 毎日 2:30 AM |
| `0 9 * * 1-5` | 平日 9:00 AM |
| `*/15 * * * *` | 15分ごと |
| `0 0 1 * *` | 毎月1日の深夜0時 |
| `0 8,17 * * *` | 毎日 8 AM と 5 PM |

## 環境変数

### 変数の設定

```
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com
HOME=/home/deploy
* * * * * /opt/myjob.sh
```

### 環境変数のメモ

| Command | Description |
|---------|-------------|
| `SHELL` | コマンドを実行するシェル（デフォルト: `/bin/sh`） |
| `PATH` | 検索パス（cron のデフォルトは最小限） |
| `MAILTO` | 出力をこのアドレスにメール（空で無効） |
| `HOME` | cron ジョブのホームディレクトリ |

## ログ

### 出力 & ログ

```
# redirect stdout + stderr to a log file
*/5 * * * * /opt/job.sh >> /var/log/job.log 2>&1
# discard all output
0 3 * * * /opt/job.sh > /dev/null 2>&1
# log only errors
0 3 * * * /opt/job.sh > /dev/null 2>> /var/log/job-err.log
```

### Cron ログの確認

```
# Debian / Ubuntu (syslog)
grep CRON /var/log/syslog
# RHEL / CentOS
cat /var/log/cron
# journalctl (systemd)
journalctl -u cron --since "1 hour ago"
```

## よく使うスケジュール

### 日常的なパターン

| Command | Description |
|---------|-------------|
| `0 * * * *` | 毎時0分 |
| `*/5 * * * *` | 5分ごと |
| `*/30 * * * *` | 30分ごと |
| `0 0 * * *` | 毎日深夜0時 |
| `0 6 * * 1` | 毎週月曜 6 AM |
| `0 0 1,15 * *` | 毎月1日と15日 |
| `0 0 * * 5` | 毎週金曜の深夜0時 |
| `0 0 1 1 *` | 毎年1月1日 |

## crontab コマンド

### crontab の管理

```
crontab -e               # edit your crontab
crontab -l               # list your crontab
crontab -r               # remove your crontab
crontab -u alice -l      # list another user's (root)
crontab /path/to/file    # install crontab from file
```

### システム crontab の場所

| Command | Description |
|---------|-------------|
| `/etc/crontab` | システム全体の crontab（ユーザーフィールドあり） |
| `/etc/cron.d/` | ドロップイン cron ファイル |
| `/etc/cron.daily/` | 毎日実行されるスクリプト |
| `/etc/cron.hourly/` | 毎時実行されるスクリプト |
| `/etc/cron.weekly/` | 毎週実行されるスクリプト |
| `/etc/cron.monthly/` | 毎月実行されるスクリプト |
| `/var/spool/cron/` | ユーザーごとの crontab の保存場所 |

## ヒント

### ベストプラクティス

| Command | Description |
|---------|-------------|
| `絶対パスを使う` | cron の PATH は最小限。常にフルパスを使用 |
| `出力をリダイレクト` | `> /dev/null 2>&1` でメール大量送信を回避 |
| `ロックファイル` | `flock` で二重起動を防止 |
| `事前テスト` | スケジューリング前に手動でコマンドをテスト |
| `MAILTO を使う` | `MAILTO=""` で全メールを抑制 |
| `タイムゾーンを確認` | cron はシステム時刻を使用。`date` で確認 |

### flock による二重起動防止

```
# only run if not already running
* * * * * /usr/bin/flock -n /tmp/job.lock /opt/job.sh
```
