# Referensi Cepat Cron

*Penjadwalan job, sintaks crontab, string khusus, logging*

> Source: crontab(5) Manual Page · MIT

## Sintaks

### Format Crontab

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

### Nilai Field

| Command | Description |
|---------|-------------|
| `*` | Nilai apapun (wildcard) |
| `,` | Daftar nilai: `1,3,5` |
| `-` | Range: `1-5` |
| `/` | Langkah: `*/10` (setiap 10) |
| `0-59` | Range menit |
| `0-23` | Range jam |
| `1-31` | Range hari dalam bulan |
| `1-12` | Range bulan (atau JAN-DEC) |
| `0-7` | Hari dalam seminggu (0&7=Min, atau SUN-SAT) |

## String Khusus

### Jadwal Singkatan

| Command | Description |
|---------|-------------|
| `@reboot` | Jalankan sekali saat startup |
| `@yearly` | `0 0 1 1 *` — sekali setahun (1 Jan) |
| `@monthly` | `0 0 1 * *` — sekali sebulan (tanggal 1) |
| `@weekly` | `0 0 * * 0` — sekali seminggu (Minggu) |
| `@daily` | `0 0 * * *` — sekali sehari (tengah malam) |
| `@hourly` | `0 * * * *` — sekali sejam |

## Contoh

### Jadwal Umum

```
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
```

### Rincian Jadwal

| Command | Description |
|---------|-------------|
| `30 2 * * *` | Setiap hari pukul 02:30 |
| `0 9 * * 1-5` | Hari kerja pukul 09:00 |
| `*/15 * * * *` | Setiap 15 menit |
| `0 0 1 * *` | Hari pertama bulan, tengah malam |
| `0 8,17 * * *` | Setiap hari pukul 08:00 dan 17:00 |

## Environment

### Mengatur Variabel

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

### Catatan Environment

| Command | Description |
|---------|-------------|
| `SHELL` | Shell untuk menjalankan perintah (default `/bin/sh`) |
| `PATH` | Search path (default cron sangat minimal) |
| `MAILTO` | Kirim output ke alamat ini (kosong = tidak ada email) |
| `HOME` | Direktori home untuk cron job |

## Logging

### Output & Logging

```
# 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
```

### Melihat 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"
```

## Jadwal Umum

### Pola Sehari-hari

| Command | Description |
|---------|-------------|
| `0 * * * *` | Setiap jam tepat |
| `*/5 * * * *` | Setiap 5 menit |
| `*/30 * * * *` | Setiap 30 menit |
| `0 0 * * *` | Setiap hari tengah malam |
| `0 6 * * 1` | Setiap Senin pukul 06:00 |
| `0 0 1,15 * *` | Tanggal 1 dan 15 setiap bulan |
| `0 0 * * 5` | Setiap Jumat tengah malam |
| `0 0 1 1 *` | Setiap 1 Januari |

## Perintah crontab

### Mengelola 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
```

### Lokasi Crontab Sistem

| Command | Description |
|---------|-------------|
| `/etc/crontab` | Crontab seluruh sistem (ada field user) |
| `/etc/cron.d/` | File cron tambahan |
| `/etc/cron.daily/` | Script yang dijalankan harian |
| `/etc/cron.hourly/` | Script yang dijalankan per jam |
| `/etc/cron.weekly/` | Script yang dijalankan mingguan |
| `/etc/cron.monthly/` | Script yang dijalankan bulanan |
| `/var/spool/cron/` | Penyimpanan crontab per-user |

## Tips

### Praktik Terbaik

| Command | Description |
|---------|-------------|
| `Gunakan path absolut` | PATH cron minimal; selalu gunakan path lengkap |
| `Redirect output` | Hindari banjir email dengan `> /dev/null 2>&1` |
| `Lock file` | Gunakan `flock` untuk mencegah eksekusi tumpang tindih |
| `Test dulu` | Jalankan perintah secara manual sebelum dijadwalkan |
| `Gunakan MAILTO` | Set `MAILTO=""` untuk matikan semua email |
| `Periksa timezone` | Cron menggunakan waktu sistem; verifikasi dengan `date` |

### Mencegah Overlap dengan flock

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