Backup pukul 02:30 tiap malam, laporan disk tiap pagi, pembersihan cache tiap pekan — pekerjaan berulang tidak mungkin kita ketik sendiri setiap saat. Linux menjawabnya dengan daemon bernama cron yang telah menjadi standar Unix sejak puluhan tahun: daemon kecil yang bangun setiap menit, memeriksa tabel jadwal, dan menjalankan perintah yang jatuh tempo. Chapter ini membedahnya dari dalam ke luar — sintaks lima field, pengelolaan tabel dengan crontab, direktori khusus untuk tugas sistem, sampai jalan pintas @daily dan kawan-kawannya.
Daemon cron: Penjaga Jadwal yang Bangun Tiap Menit #
Daemon cron dijalankan sejak sistem dinyalakan dan tertidur di antara menit-menitnya. Begitu menit berganti, daemon membaca ulang seluruh tabel jadwal lalu menjalankan setiap perintah yang jadwalnya cocok dengan menit itu. Tiga sumber tabel yang diperiksa: file crontab milik tiap user (di bawah /var/spool/cron/crontabs), file sistem /etc/crontab, dan berkas lepas di /etc/cron.d/. Resolusi terkecil jadwal cron adalah satu menit — untuk ketepatan detik diperlukan systemd timer, dan perbandingannya menutup chapter ini.
Lima Field Jadwal, Dibaca Kiri ke Kanan #
Setiap baris jadwal terdiri atas lima field waktu yang diikuti perintah. Kelimanya dipisah spasi dan urutannya selalu sama:
| Posisi | Field | Rentang |
|---|---|---|
| 1 | menit | 0-59 |
| 2 | jam | 0-23 |
| 3 | tanggal dalam bulan | 1-31 |
| 4 | bulan | 1-12, atau nama jan-des |
| 5 | hari dalam pekan | 0-7, 0 dan 7 sama-sama Minggu, atau sun-sat |
Dalam tiap field kita bisa memakai empat operator: * berarti semua nilai, */15 berarti setiap 15 satuan, 1-5 berarti rentang dari 1 sampai 5, dan 1,15 berarti daftar nilai terpilih. Kombinasi yang paling sering terpakai:
| Ekspresi | Arti |
|---|---|
30 2 * * * | pukul 02:30 setiap hari |
*/10 * * * * | setiap 10 menit |
0 3 * * 1-5 | pukul 03:00, Senin sampai Jumat |
0 4 1 * * | pukul 04:00 pada tanggal 1 setiap bulan |
0 22 * * 1 | pukul 22:00 setiap Senin |
0 0 25 12 * | tengah malam tanggal 25 Desember |
Sebelum jadwal dipasang, ada baiknya angka-angkanya diperiksa dulu. Skrip berikut memvalidasi field menit dari tiga baris jadwal ujian — dua wajar dan satu yang sengaja salah:
cat > jadwal-uji.txt << 'EOF'
30 2 * * * /home/budi/bin/backup.sh
75 2 * * * /home/budi/bin/backup.sh
* * * * * echo "detak" >> /home/budi/log/detak.log
EOF
awk '{
if (NF < 6) {
printf "baris %d: field kurang dari 6\n", NR
} else if ($1 == "*" || ($1 ~ /^[0-9]+$/ && $1 + 0 <= 59)) {
printf "baris %d: menit %s valid\n", NR, $1
} else {
printf "baris %d: menit %s tidak valid (harus 0-59 atau *)\n", NR, $1
}
}' jadwal-uji.txtOutput yang Dihasilkan:
baris 1: menit 30 valid
baris 2: menit 75 tidak valid (harus 0-59 atau *)
baris 3: menit * validMari kita telaah blok di atas:
- Baris 1-5 (
cat > jadwal-uji.txt << 'EOF' ...): membuat file uji berisi tiga baris jadwal; heredoc dikutip dengan'EOF'agar isinya tersimpan literal. - Baris 7-8 (
if (NF < 6)): lima field waktu plus perintah minimal berarti enam field — baris yang lebih pendek pasti salah tulis.NFadalah jumlah field danNRnomor baris. - Baris 9-10 (
else if ($1 == "*" || ...)): field menit ($1) valid bila*atau angka 0-59; uji^[0-9]+$memastikan isinya murni digit sebelum dibandingkan numerik. - Baris 11-13 (
else ...): sisanya ditolak, dan memang hanya menit75pada baris kedua file uji yang dicap tidak valid.
Pola ini bisa diperluas ke empat field lainnya dengan rentang yang sesuai. Aturan sintaks lengkapnya ada di alaman manual crontab(5) .
Mengelola crontab Sendiri dengan -e, -l, dan -r #
Tabel jadwal milik user tidak diedit langsung di file spool, melainkan lewat perintah crontab: crontab -e membuka editor untuk menyunting tabel, crontab -l mencetak tabel yang sedang terpasang, dan crontab -r menghapus seluruh tabel tanpa konfirmasi — r itu singkatan remove, jadi berhati-hatilah. Berikut contoh tampilan crontab -l setelah dua jadwal dipasang:
budi@server-kantor:~$ crontab -l
# Backup harian pukul 02:30
30 2 * * * /home/budi/bin/backup.sh >> /home/budi/log/backup.log 2>&1
# Catat sisa disk setiap pagi pukul 07:00
0 7 * * * df -h / | tail -1 >> /home/budi/log/disk.log
Baris yang diawali # adalah komentar dan diabaikan cron. Perhatikan pola redirection >> file 2>&1 di akhir tiap baris: tanpa terminal, output yang tidak dialihkan dikirim ke email user melalui variabel MAILTO — dan di mesin tanpa mail server, output itu lenyap begitu saja. Variabel pendukung diletakkan di atas tabel sebelum baris jadwal:
SHELL=/bin/bash
PATH=/home/budi/bin:/usr/bin:/bin
MAILTO=""
30 2 * * * backup.sh >> /home/budi/log/backup.log 2>&1Tiga variabel itu mengatur lingkungan eksekusi: SHELL menentukan shell yang menjalankan perintah (bawaannya sh), PATH mengatur pencarian program — /home/budi/bin harus didaftarkan bila perintah dipanggil tanpa path penuh — dan MAILTO penerima email output; kosongkan untuk mematikan pengiriman. Environment cron memang jauh lebih minimal daripada shell interaktif, dan pengamanan eksekusi dobel dengan flock dibahas di Chapter Scheduling Scripts pada Section Shell dan Scripting.
Direktori cron Sistem dan /etc/crontab #
Untuk tugas milik sistem, tidak selalu perlu tabel per user. Paket dan administrator cukup meletakkan skrip executable pada direktori frekuensi: /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, dan /etc/cron.monthly. Isi /etc/cron.daily pada sistem Debian terlihat seperti berikut:
ls /etc/cron.daily
stat -c '%A %n' /etc/cron.daily/*Output yang Dihasilkan:
apt-compat
dpkg
-rwxr-xr-x /etc/cron.daily/apt-compat
-rwxr-xr-x /etc/cron.daily/dpkgDua baris output itu memperlihatkan dua syarat sekaligus: apt-compat dan dpkg adalah skrip bawaan paket yang dijalankan sekali sehari, dan permission -rwxr-xr-x menegaskan bahwa skrip di direktori ini harus bisa dieksekusi — file tanpa bit x akan dilewati. Jadwal harian sekitar pukul 06:25 itu sendiri diatur oleh file /etc/crontab, tabel milik sistem yang formatnya punya satu field ekstra. Berikut contoh tampilan isinya pada Debian:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.daily; }
47 6 * * 7 root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.weekly; }
52 6 1 * * root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.monthly; }Perbedaannya ada di kolom user di antara lima field waktu dan perintah: karena tabel ini milik sistem, cron perlu tahu sebagai user siapa perintah dijalankan — keempat baris di atas milik root. Perintah run-parts itulah yang menjalankan seluruh skrip di direktori frekuensi tadi; cara kerja daemon yang memeriksa seluruh sumber ini didokumentasikan di cron(8)
.
Jalan Pintas Jadwal dengan @ #
Lima field sering kali berlebihan untuk jadwal standar, sehingga cron menyediakan alias yang diawali @. Alias ini menggantikan kelima field sekaligus — cukup ditulis di awal baris lalu diikuti perintah:
| Alias | Setara dengan | Arti |
|---|---|---|
@reboot | — | sekali setiap kali sistem dinyalakan |
@hourly | 0 * * * * | menit pertama setiap jam |
@daily / @midnight | 0 0 * * * | tengah malam setiap hari |
@weekly | 0 0 * * 0 | tengah malam setiap Minggu |
@monthly | 0 0 1 * * | tengah malam tanggal 1 setiap bulan |
@yearly / @annually | 0 0 1 1 * | sekali setahun, 1 Januari tengah malam |
Alias paling istimewa adalah @reboot karena tidak punya padanan lima field — skripnya berjalan satu kali setiap boot, cocok untuk membersihkan file sementara. Sisanya hanyalah gula sintaksis: @daily curl -s contoh.example.com/ping >> /home/budi/log/heartbeat.log sama artinya dengan 0 0 * * * diikuti perintah yang sama.
Cron menuntaskan penjadwalan klasik dengan satu file teks dan daemon kecil. Namun init sistem modern juga bisa menjadwalkan — dengan log terstruktur dan kemampuan mengejar jadwal yang terlewat. Perbandingan keduanya menjadi materi penutup Section ini: Chapter systemd Timers .