cron dan penjadwalan

Sintaks berkas crontab untuk menjadwalkan job berulang beserta pencatatan log-nya.

Daftar isi

Topik ini membahas cron, yaitu daemon yang menjalankan job berulang pada waktu yang dijadwalkan, mulai dari cadangan harian sampai pembersihan log mingguan. Jadwalnya ditulis dalam berkas crontab yang menyertai setiap pengguna. Bahasan mencakup cara kerja daemon, sintaks lima field penjadwalan, contoh berkas crontab, dan pencatatan log agar keluaran job tidak hilang tanpa jejak. Lingkungan yang paling banyak memakai cron adalah server, runner CI, dan container yang perlu memicu pekerjaan tanpa campur tangan manusia.

Cara kerja daemon cron#

Daemon cron berjalan sejak sistem dinyalakan dan terus hidup di latar belakang. Setiap menit ia memeriksa berkas crontab seluruh pengguna yang tersimpan di bawah /var/spool/cron, lalu menjalankan setiap baris yang waktunya cocok dengan menit tersebut. Berkas di direktori spool tidak diedit langsung, melainkan dipasang melalui perintah crontab yang mengatur izin dan memberi tahu daemon.

Setiap job dijalankan dengan hak pengguna pemilik crontabnya, tanpa sesi login dan tanpa lingkungan shell interaktif. Variabel PATH pada eksekusi cron biasanya hanya /usr/bin:/bin, sedangkan HOME diambil dari entri pengguna di /etc/passwd. Karena itu skrip yang bergantung pada PATH yang panjang sebaiknya dipanggil dengan jalur lengkap, misalnya /usr/local/bin/pantau-suhu.sh, dan variabel yang dibutuhkan dideklarasikan di bagian atas berkas crontab atau di dalam skripnya.

Sintaks lima field penjadwalan#

Setiap baris crontab yang bukan komentar terdiri atas lima field waktu diikuti perintah yang dijalankan. Field dipisahkan spasi dan dibaca berurutan sebagaimana tabel berikut.

FieldRentang nilaiKeterangan
menit0-59menit dalam satu jam
jam0-23jam dalam satu hari
tanggal1-31tanggal dalam satu bulan
bulan1-12 atau jan-decbulan dalam satu tahun
hari minggu0-7 atau sun-sat0 dan 7 sama-sama Minggu

Empat karakter khusus menyusun pola di dalam field.

  • * mencocokkan setiap nilai yang mungkin pada field tersebut.
  • , memilih beberapa nilai sekaligus, misalnya 0,30 untuk menit 0 dan 30.
  • - menyatakan rentang, misalnya 9-17 untuk jam kerja.
  • / menambahkan langkah tetap, misalnya */15 untuk setiap 15 menit.

Kolom perintah dibaca hingga akhir baris, termasuk perintah dengan flag dan redirection. Baris yang diawali # diabaikan, sehingga komentar berbahasa Indonesia dapat ditulis di berkas crontab. Nama tiga huruf untuk bulan dan hari, seperti jan atau mon, juga diterima pada field terkait.

Contoh berkas crontab#

Contoh berikut menyatukan sintaks di atas menjadi berkas crontab pengguna budi. Setiap barisnya memicu satu skrip pemeliharaan dengan jadwal yang berbeda. Berkas semacam ini dipasang dengan crontab -e dan langsung berlaku pada menit berikutnya.

text Contoh: berkas crontab pengguna
# m    h  tgl bul hari  perintah
*/15 * * * * /usr/local/bin/pantau-suhu.sh
0 2 * * 1-5 /home/budi/bin/cadangan-harian.sh
0 9 1 * * /home/budi/bin/laporan-bulanan.sh
5 4 * * 0 /home/budi/bin/bersihkan-log.sh

Baris pertama menjalankan pencatatan sensor suhu setiap 15 menit sepanjang hari. Baris kedua menjalankan cadangan harian pukul 02:00 pada hari kerja Senin sampai Jumat. Baris ketiga memicu laporan bulanan pukul 09:00 pada tanggal 1 setiap bulan, sedangkan baris keempat membersihkan log pukul 04:05 setiap hari Minggu.

Mencatat log job terjadwal#

Secara bawaan cron menampung keluaran standar dan error standar setiap job, lalu mengirimkannya sebagai surat lokal kepada pemilik crontab. Server dan container umumnya tidak menjalankan layanan surat, sehingga keluaran itu hilang tanpa jejak dan error pada job tidak terdeteksi. Karena itu setiap job yang menghasilkan keluaran diarahkan ke berkas log melalui redirection.

Redirection >> /home/budi/log/cadangan.log 2>&1 menambah keluaran standar ke berkas log, lalu menggabungkan error standar ke aliran yang sama. Tanda >> menambah di akhir berkas, sedangkan > menimpa isi berkas pada setiap eksekusi. Timestamp dapat ditambahkan dengan menyisipkan perintah date, misalnya (date '+%F %T'; /home/budi/bin/cadangan-harian.sh) >> /home/budi/log/cadangan.log 2>&1.

text Contoh: baris crontab dengan pencatatan log
0 2 * * 1-5 /home/budi/bin/cadangan-harian.sh >> /home/budi/log/cadangan.log 2>&1
*/15 * * * * /usr/local/bin/pantau-suhu.sh >> /home/budi/log/suhu.log 2>&1

Selain log milik job, cron mencatat setiap eksekusi ke log sistem. Pada Debian dan Ubuntu barisnya muncul di /var/log/syslog dengan penanda CRON, sedangkan pada RHEL tersedia berkas /var/log/cron. Pencarian grep CRON /var/log/syslog memperlihatkan jam eksekusi dan alasan job yang tidak berjalan, misalnya karena nama perintahnya salah.

Apabila layanan surat lokal memang berjalan, variabel MAILTO di bagian atas berkas crontab mengarahkan surat keluaran job ke alamat tertentu, misalnya [email protected]. Tanpa variabel itu, surat ditujukan kepada pemilik crontab. Kedua mekanisme ini saling melengkapi, yaitu berkas log untuk isi keluaran dan surat atau log sistem untuk notifikasi kegagalan.

Mengelola crontab#

Berkas crontab pengguna dikelola dengan tiga subperintah utama. Opsi -e membuka editor yang ditunjuk variabel EDITOR dan memasang berkasnya setelah disimpan, opsi -l mencetak isi crontab yang sedang terpasang, dan opsi -r menghapus crontab pengguna. Daemon membaca ulang berkasnya secara otomatis, sehingga tidak ada perintah restart yang diperlukan. Contoh berikut tidak dapat dieksekusi di sandbox karena daemon cron dan perintah crontabnya tidak tersedia.

bash
# tidak-dijalankan
# crontab tidak tersedia di sandbox karena daemon cron tidak berjalan
# -e membuka editor dan memasang berkas setelah disimpan
crontab -e
# -l mencetak isi crontab pengguna saat ini
crontab -l

Ringkasan#

  • Daemon cron memeriksa berkas crontab setiap menit dan menjalankan baris yang cocok dengan hak pengguna pemiliknya.
  • Jadwal ditulis dalam lima field, yaitu menit, jam, tanggal, bulan, dan hari minggu, dengan *, ,, -, dan / sebagai penyusun polanya.
  • Keluaran job diarahkan ke berkas log dengan redirection agar tidak bergantung pada layanan surat lokal.
  • Opsi -e, -l, dan -r pada crontab mengedit, mencetak, dan menghapus crontab pengguna.

Referensi#