Setiap website yang aktif menyimpan pekerjaan yang harus diulang terus-menerus. Basis data perlu dicadangkan setiap malam, berkas sementara perlu dibersihkan, laporan penjualan perlu dikirim setiap Senin pagi. Selama dikerjakan dengan tangan, ada dua hal yang menghambat: Anda harus mengingatnya, dan Anda harus ada di depan komputer pada jam yang tepat.
Sistem operasi Unix dan Linux menyelesaikannya lewat sebuah program kecil yang berjalan diam-diam di latar belakang server. Cron job adalah tugas yang Anda titipkan kepada program tersebut, lengkap dengan jadwal kapan ia harus dijalankan. Setelahnya, tugas itu berjalan sendiri tanpa ada yang perlu menekan tombol.
Apa Itu Cron Job?
Cron job adalah satu perintah atau skrip yang dijalankan server secara otomatis pada waktu yang sudah Anda tentukan. Waktu itu bisa berupa satu titik tertentu, misalnya pukul 02.00 setiap hari, atau berupa pengulangan, misalnya setiap lima belas menit sepanjang hari.
Ada tiga istilah yang sering tertukar padahal merujuk pada hal yang berbeda:
- Cron: nama programnya. Cron adalah sebuah daemon (program yang berjalan terus-menerus di latar belakang tanpa antarmuka dan tanpa campur tangan pengguna). Ia menyala bersama server dan tidak pernah berhenti selama server hidup.
- Cron job: satu tugas terjadwal. Kalau Anda menyetel pencadangan harian dan pembersihan mingguan, Anda memiliki dua cron job.
- Crontab: kependekan dari cron table, yaitu berkas berisi daftar seluruh cron job beserta jadwalnya. Satu baris di dalam crontab sama dengan satu cron job.
Bayangkan seorang petugas yang setiap menit membuka buku jadwalnya dan mengerjakan baris mana pun yang waktunya cocok. Petugas itu cron, bukunya crontab, dan tiap barisnya satu cron job.
Cara Cron Bekerja di Balik Layar
Memahami alurnya memudahkan Anda menebak penyebab saat jadwal tidak berjalan seperti harapan.
Diagram alur cron job memeriksa crontab aktif, mencocokkan jadwal, lalu menjalankan perintah atau menunggu.
Siklus ini berulang setiap menit selama server menyala.
Poin terpenting dari alur di atas adalah cron tidak menghitung mundur. Ia hanya membandingkan jadwal dengan jam saat ini, satu kali setiap menit. Dari sinilah datang satuan waktu terkecil cron: satu menit.
Hal kedua, perintah tidak dijalankan cron secara langsung, melainkan diserahkan kepada shell (program penerjemah perintah teks). Detail ini menjadi sumber sebagian besar kegagalan yang dibahas di bagian akhir artikel.
Fungsi Cron Job dalam Pengelolaan Website
Bagi pemilik website, cron job umumnya dipakai untuk lima keperluan berikut:
- Pencadangan otomatis: menyalin basis data dan berkas website ke lokasi terpisah pada jam sepi. Ini bentuk backup terjadwal yang paling umum.
- Pembersihan berkas sementara: menghapus berkas unggahan gagal, sesi kedaluwarsa, dan berkas cache yang menumpuk. Tanpa pembersihan berkala, kuota penyimpanan bisa habis oleh berkas tak berguna.
- Pengiriman email terjadwal: mengirim laporan harian, ringkasan pesanan, atau pengingat kepada pelanggan pada jam yang sama setiap hari.
- Sinkronisasi data: menarik data stok, kurs, atau harga dari layanan lain pada interval tertentu supaya isi website selalu mutakhir.
- Memanggil skrip aplikasi: banyak framework menyediakan perintah pemeliharaan yang memang dirancang untuk dipanggil berkala, misalnya pemrosesan antrean atau pembuatan ulang indeks pencarian.
Membaca Lima Kolom Waktu di Crontab
Satu baris crontab terdiri dari lima kolom waktu diikuti perintahnya. Urutan kolom selalu tetap dan dipisahkan spasi:
| Urutan | Kolom | Rentang nilai yang sah |
|---|---|---|
| 1 | Menit | 0–59 |
| 2 | Jam | 0–23 |
| 3 | Tanggal | 1–31 |
| 4 | Bulan | 1–12 |
| 5 | Hari dalam minggu | 0–7 |
Pada kolom kelima, angka 0 dan 7 sama-sama berarti Minggu, sementara 1 sampai 6 berarti Senin sampai Sabtu.
Baris crontab 30 2 * * * dengan lima kolom waktu: Menit, Jam, Tanggal, Bulan, dan Hari, diikuti perintah.
Urutan kolom selalu tetap; nilai yang tertukar membentuk jadwal yang sama sekali berbeda.
Setiap kolom bisa diisi dengan empat cara berbeda:
- Tanda bintang (
*) berarti seluruh nilai yang mungkin. Pada kolom jam,*berarti setiap jam. - Koma dipakai untuk mendaftar beberapa nilai. Isian
0,15,30,45pada kolom menit berarti empat kali setiap jam. - Tanda hubung menyatakan rentang berurutan. Isian
8-17pada kolom jam mencakup pukul 08.00 sampai 17.00. - Garis miring menyatakan langkah atau kelipatan. Isian
*/10pada kolom menit berarti setiap sepuluh menit.
Dengan bekal itu, baris 30 2 * * * terbaca sebagai menit ke-30, jam ke-2, setiap tanggal, bulan, dan hari. Artinya, perintah berjalan pukul 02.30 setiap hari.
Untuk jadwal yang paling umum tersedia jalan pintas berawalan @ yang menggantikan kelima kolom sekaligus:
| Jalan pintas | Setara dengan | Artinya |
|---|---|---|
@hourly | 0 * * * * | setiap awal jam |
@daily | 0 0 * * * | setiap tengah malam |
@weekly | 0 0 * * 0 | setiap Minggu tengah malam |
@monthly | 0 0 1 * * | setiap tanggal 1 tengah malam |
@yearly | 0 0 1 1 * | setiap 1 Januari tengah malam |
@reboot | — | setiap kali server selesai dinyalakan |
Contoh Cron Job untuk Kebutuhan Sehari-hari
Tabel berikut berisi jadwal yang paling sering dibutuhkan pemilik website, beserta pembacaannya:
| Baris jadwal | Kapan berjalan | Cocok untuk |
|---|---|---|
0 1 * * * | setiap hari pukul 01.00 | pencadangan basis data saat kunjungan paling sepi |
*/15 * * * * | setiap 15 menit | pemrosesan antrean email dan notifikasi |
0 */6 * * * | pukul 00.00, 06.00, 12.00, dan 18.00 | penarikan data stok dari sistem lain |
0 3 * * 0 | setiap Minggu pukul 03.00 | pembersihan berkas sementara mingguan |
0 7 1 * * | setiap tanggal 1 pukul 07.00 | pengiriman laporan bulanan |
30 8-17 * * 1-5 | menit ke-30 tiap jam, pukul 08.00–17.00, Senin sampai Jumat | pembaruan data yang hanya relevan pada jam kerja |
Semua jadwal di atas mengikuti jam yang dipakai server, bukan jam di komputer Anda. Bila server berada di zona waktu berbeda, pukul 01.00 versi server bisa jatuh pada sore hari menurut jam Anda. Periksa zona waktu server sebelum menetapkan jadwal yang sensitif terhadap waktu.
Aturan Tanggal dan Hari yang Sering Salah Dipahami
Satu aturan crontab berikut bertentangan dengan dugaan hampir semua orang. Perhatikan baris ini:
0 0 1 * 1 /home/user/laporan.shSekilas baris itu terbaca sebagai "setiap tanggal 1 yang kebetulan jatuh pada hari Senin" — sebuah kejadian yang hanya muncul satu atau dua kali setahun. Perintah tersebut sebenarnya berjalan setiap tanggal 1, dan juga setiap hari Senin, sehingga dalam sebulan ia dijalankan sekitar lima kali.
Penyebabnya adalah cara cron memperlakukan kolom ketiga dan kolom kelima. Ketika kedua kolom itu sama-sama diisi nilai tertentu, cron menggabungkannya dengan logika ATAU, bukan DAN. Aturan ini tertulis eksplisit di dokumentasi resmi man 5 crontab.
Selama salah satu kolom itu diisi tanda bintang, perilaku ini tidak muncul. Baris 0 0 * * 1 tetap berarti setiap Senin, dan 0 0 1 * * tetap setiap tanggal 1.
Lalu bagaimana kalau yang Anda maksud memang "dan"? Crontab sendiri tidak menyediakan caranya, sehingga pemeriksaan harus dipindahkan ke dalam perintah. Berikut cara menuliskannya untuk kasus "tanggal 1 yang jatuh pada hari Senin":
0 0 1 * * [ "$(date +\%u)" = "1" ] && /home/user/laporan.shPerintah date +%u menghasilkan nomor hari dalam minggu, dengan 1 berarti Senin sampai 7 berarti Minggu. Jadwal dibiarkan berjalan setiap tanggal 1, lalu skrip hanya dieksekusi bila pemeriksaan hari terpenuhi. Perhatikan garis miring terbalik sebelum %; alasannya dijelaskan di bagian berikutnya.
Di Mana Cron Job Anda Sebenarnya Disimpan
Cron job tidak berkumpul di satu berkas. Ada tiga lokasi, masing-masing dengan aturan penulisan berbeda.
Pertama, crontab milik masing-masing pengguna. Inilah yang dibuka dengan perintah crontab -e dan ditampilkan dengan crontab -l. Isinya persis seperti yang dibahas sejauh ini: lima kolom waktu diikuti perintah. Setiap tugas berjalan dengan hak akses pengguna pemilik crontab tersebut.
Kedua, berkas jadwal milik sistem, yaitu /etc/crontab dan berkas-berkas di dalam folder /etc/cron.d/. Berkas ini punya satu perbedaan penting: ada kolom keenam berisi nama pengguna yang disisipkan di antara kolom waktu dan perintah.
Ketiga, folder siap pakai seperti /etc/cron.daily/, /etc/cron.hourly/, /etc/cron.weekly/, dan /etc/cron.monthly/. Skrip yang Anda letakkan di dalamnya akan dijalankan sesuai nama foldernya tanpa perlu menuliskan jadwal sama sekali.
Baris crontab pengguna berisi lima kolom waktu, sedangkan /etc/crontab menyisipkan nama pengguna sebelum perintah.
Hanya berkas sistem yang memakai kolom keenam berisi nama pengguna.
Perbedaan jumlah kolom itulah yang menjelaskan satu keluhan yang sering muncul. Saat sebuah baris disalin dari /etc/crontab ke crontab pribadi, nama pengguna di kolom keenam ikut terbawa. Nama itu langsung dianggap sebagai nama perintah, dan yang muncul adalah pesan command not found. Sebaliknya, baris crontab pribadi yang ditempel ke /etc/cron.d/ akan kehilangan kolom pengguna dan diabaikan sistem.
Mengakses ketiga lokasi ini membutuhkan terminal lewat SSH, dan berkas di dalam /etc/ menuntut hak administrator penuh. Hak sebesar itu tidak diberikan pada hosting bersama, sehingga penyuntingan langsung umumnya hanya mungkin di VPS Indonesia atau server yang Anda kelola sendiri.
Cara Membuat Cron Job Lewat cPanel
Bagi Anda yang memakai layanan web hosting dan belum terbiasa dengan terminal, seluruh proses di atas tersedia dalam bentuk formulir di cPanel. Menunya bernama Cron Jobs dan berada di grup Advanced.
Formulir tersebut meminta enam isian wajib: Minute, Hour, Day, Month, Weekday, dan Command. Lima isian pertama persis sama dengan lima kolom waktu tadi, hanya disajikan sebagai kotak terpisah berisi pilihan siap pakai.
Di atas formulir terdapat kolom Cron Email. Alamat yang Anda isikan di sana akan menerima keluaran dari setiap cron job yang berjalan. Bila kolom itu dikosongkan, notifikasi mati untuk seluruh tugas. Untuk mematikan notifikasi hanya pada satu tugas tertentu, tambahkan /dev/null 2>&1 di akhir perintahnya.
Penyedia hosting umumnya membatasi seberapa rapat jadwal boleh disetel. Pada shared hosting Indowebsite, cron job tidak diperkenankan berjalan lebih rapat dari 15 menit sekali. Batas ini wajar karena satu server ditempati banyak akun, dan jadwal yang terlalu rapat akan menyita jatah pengguna lain.
Dokumentasi resmi cPanel memberi peringatan senada: jadwal yang terlalu rapat berisiko membuat server memulai eksekusi berikutnya sebelum yang sebelumnya selesai.
Langkah lengkap beserta tampilan tiap menunya sudah dibahas terpisah di panduan setting cron job melalui cPanel.
Kenapa Cron Job Tidak Berjalan Padahal Perintahnya Benar
Jadwal sudah dipasang, perintahnya terbukti bekerja saat diketik langsung di terminal, tetapi tidak terjadi apa-apa saat waktunya tiba. Empat penyebab berikut menjelaskan hampir semua kasus semacam ini.
Pertama, PATH yang diwarisi cron jauh lebih pendek. Saat Anda masuk ke terminal, sistem memuat berkas konfigurasi yang mendaftarkan banyak lokasi program. Cron melewatkan proses itu dan hanya mengenal beberapa lokasi dasar. Akibatnya php artisan ... yang lancar di terminal bisa berakhir sebagai command not found di cron. Perbaikannya adalah menuliskan lokasi lengkap program, yang bisa Anda temukan dengan perintah berikut:
command -v phpHasilnya berupa jalur seperti /usr/local/bin/php, dan jalur itulah yang dipakai di crontab, bukan sekadar php.
Kedua, perintah dijalankan oleh /bin/sh, bukan bash. Pada banyak distribusi Linux, /bin/sh sebenarnya menunjuk ke dash (shell ringan yang hanya mendukung sintaks standar). Skrip yang memakai penulisan khas bash akan langsung berhenti di sana. Menguji kedua sintaks berikut pada dash menghasilkan penolakan yang tegas:
arr=(a b c) # dash: Syntax error: "(" unexpected
[[ "a" == "a" ]] # dash: [[: not foundKedua baris tersebut berjalan normal di bash. Solusinya ada dua: menambahkan baris SHELL=/bin/bash di bagian atas crontab, atau memanggil skrip secara eksplisit dengan /bin/bash /home/user/skrip.sh.
Ketiga, karakter % berubah menjadi baris baru. Di dalam crontab, tanda persen tidak diperlakukan sebagai karakter biasa. Setiap % yang tidak diawali garis miring terbalik akan diubah menjadi baris baru, dan seluruh teks setelah % pertama justru dikirim ke perintah sebagai masukan. Perintah semacam date +%Y-%m-%d karena itu rusak diam-diam. Penulisan yang benar adalah:
0 2 * * * /home/user/backup.sh $(date +\%Y-\%m-\%d)Penyebab ini paling melelahkan karena tidak menghasilkan pesan kesalahan yang mengarah ke akar masalahnya.
Keempat, skrip tidak memiliki izin eksekusi. Berkas yang baru diunggah lewat FTP sering tidak membawa izin tersebut. Tandanya berupa pesan permission denied, dan perbaikannya satu perintah:
chmod +x /home/user/skrip.shDi luar keempat hal itu, langkah paling berguna bukan menebak, melainkan melihat apa yang benar-benar terjadi. Arahkan seluruh keluaran perintah ke sebuah berkas log:
0 2 * * * /home/user/backup.sh >> /home/user/cron.log 2>&1Tanda >> menambahkan keluaran ke berkas tanpa menghapus isi sebelumnya, sedangkan 2>&1 mengalihkan pesan kesalahan ke tujuan yang sama dengan keluaran biasa. Tanpa bagian 2>&1, justru pesan kesalahan yang Anda butuhkan tidak akan pernah tercatat.
Keterbatasan Cron yang Perlu Anda Pertimbangkan
Cron bertahan puluhan tahun karena sederhana dan ringan. Kesederhanaan itu datang bersama sejumlah batasan.
- Satuan terkecilnya satu menit. Kebutuhan yang lebih rapat harus ditangani proses yang berjalan terus-menerus, bukan cron.
- Tidak ada pengulangan otomatis saat gagal. Bila perintah gagal karena koneksi terputus, cron tidak mencoba lagi. Ia baru menjalankannya kembali pada jadwal berikutnya.
- Tidak ada pemberitahuan saat tugas berhenti diam-diam. Cron memberi tahu saat ada keluaran, tetapi diam saat tugas tidak pernah berjalan. Pencadangan yang mati sejak tiga minggu lalu bisa tidak ketahuan sampai data dibutuhkan.
- Eksekusi bisa menumpuk. Tugas berjadwal lima menit yang butuh tujuh menit akan menumpuk sampai server kewalahan. Pengamannya biasanya penguncian dengan
flock. - Jadwal yang terlewat tidak dikejar. Bila server mati pada saat jadwal jatuh tempo, tugas itu hilang begitu saja tanpa dijalankan susulan.
- Zona waktu mengikuti server. Perubahan zona waktu server akan menggeser seluruh jadwal sekaligus.
Alternatif Cron Job
Cron bukan satu-satunya cara menjadwalkan tugas, dan untuk beberapa keperluan pilihan lain lebih tepat:
- systemd timer tersedia di hampir semua distribusi Linux modern. Lebih rumit dituliskan, tetapi mencatat riwayat eksekusi terpusat dan bisa mengejar tugas yang terlewat setelah server menyala.
- anacron dirancang untuk mesin yang tidak menyala sepanjang hari. Tugas harian yang terlewat dikerjakan begitu mesin dinyalakan kembali.
- Task Scheduler adalah padanan cron di Windows, dengan antarmuka grafis dan pemicu yang lebih luas daripada sekadar waktu.
- Penjadwal bawaan framework seperti di Laravel memindahkan definisi jadwal ke dalam kode aplikasi. Cron tetap dibutuhkan, tetapi hanya satu baris pemanggil.
Pertanyaan yang Sering Muncul
Apa beda cron dan crontab?
Cron adalah program yang berjalan di latar belakang server, crontab adalah berkas daftar jadwal yang dibacanya. Perintah crontab juga dipakai menyunting berkas itu.
Apakah cron job tersedia di hosting bersama?
Umumnya tersedia lewat menu Cron Jobs di cPanel, tanpa akses ke berkas sistem seperti /etc/cron.d/. Perintahnya pun terbatas pada hak akses akun Anda.
Berapa interval tercepat yang bisa diatur?
Secara teknis satu menit, dengan penulisan * * * * *. Namun penyedia hosting biasanya menetapkan batas lebih longgar — di shared hosting Indowebsite, 15 menit.
Kenapa cron job berjalan dua kali padahal jadwalnya satu?
Penyebab tersering adalah jadwal yang sama terpasang di dua tempat, misalnya di crontab pengguna sekaligus di /etc/cron.d/. Kemungkinan lain adalah aturan ATAU pada kolom tanggal dan hari yang sudah dibahas di atas.
Kesimpulan
Cron job adalah cara paling sederhana untuk menyerahkan pekerjaan berulang kepada server, dan kuncinya terletak pada kemampuan membaca lima kolom waktu di crontab dengan benar. Dua hal paling sering menjadi sumber persoalan. Pertama, aturan ATAU pada kolom tanggal dan hari. Kedua, lingkungan eksekusi cron yang lebih terbatas daripada terminal, terutama soal PATH dan shell.
Untuk pencadangan, pembersihan, dan pemanggilan skrip berkala, cron sudah lebih dari memadai. Namun bila Anda membutuhkan pengulangan otomatis saat gagal atau pemantauan yang bisa dipercaya, systemd timer dan penjadwal bawaan aplikasi adalah titik awal yang lebih tepat. Semoga artikel ini membantu.




