Dasar
Cron adalah fasilitas yang tersedia di sistem operasi Unix untuk menjalankan sebuah perintah secara berkala. Frekuensi waktu terkecilnya adalah 1 menit sekali. Frekuensi terbesarnya hingga beberapa tahun sekali. Dapat juga dipilih ingin menjalankan setiap hari tertentu, setiap berapa jam sekali, pada menit keberapa, dst.
Untuk menggunakan crontab, saat ini silakan SSH ke server hosting. (Aktifkan dulu fasilitas SSH di control panel jika masih mati, caranya lihat di sini). Lalu ketikkan:
$ crontab -e
(Catatan: lambang “$ ” menunjukkan prompt shell, bukan untuk diketik secara literal).
Anda akan masuk ke editor dan siap mengetikkan daftar perintah dalam sebuah format yang disebut crontab (“cron table”). Adapun format crontab ini dijelaskan dalam manual page Unix (dapat dilihat dengan mengetikkan perintah “man 5 crontab” pada prompt shell).
Jika Anda tidak suka editor default, Anda bisa keluar lalu mengetikkan seperti ini:
$ EDITOR=joe crontab -e
untuk memilih editor joe, misalnya. Bisa juga editor-editor lain seperti pico, emacs, vim, dll.
Setelah membuat crontab, save dan keluarlah dari editor. Maka crontab akan terpasang.
Untuk melihat crontab saat ini, gunakan:
$ crontab -l
Untuk menghapus crontab:
$ crontab -r
Format crontab
Pada dasarnya setiap baris berisi 6 kolom. Lima kolom pertama adalah spesifikasi waktu yang diinginkan. Kolom ke 6 dan seterusnya berisi perintah yang ingin dijalankan. Lima kolom waktu berturut-turut adalah menit, jam, hari, bulan, day of week. Tiap kolom waktu dapat diisi angka, deretan angka dipisahkan koma, atau *, atau */N di mana N adalah angka. Contoh:
0 * * * * PERINTAH...
artinya jalankan pada menit ke-0 di setiap jam/setiap hari/setiap bulan/day of week apa saja. Perintah akan dijalankan sekali setiap jam yaitu pada menit ke-0 (contoh: 00:00, 01:00, dst).
*/5 * * * * PERINTAH...
Jalankan setiap 5 menit sekali.
30 13 * * * PERINTAH...
Jalankan sekali sehari, yaitu pada pukul 13:30 (waktu server).
0 0 * * 6,7 PERINTAH...
Jalankan sekali sehari setiap tengah malam (pk 00:00) tapi hanya pada weekend (6=sabtu, 7=minggu).
FAQ
Saya sudah membuat crontab, mengapa saya tidak melihat hasilnya apa-apa?
Tambahkan baris ini di awal crontab Anda:
MAILTO=alamat@email.anda
dan ganti alamat@email.anda dengan alamat email Anda. Anda bisa membuat perintah test yang dijalankan setiap menit, misalnya:
* * * * * echo test
maka pada menit berikutnya Anda akan menerima email berisi output perintah cron, dalam kasus ini adalah test.
Jika ingin mengetes perintah, usahakan perintah Anda mengeluarkan suatu output, maka Anda akan mendapati outputnya di email.
Saya menerima terlalu banyak email dari cron, bagaimana menguranginya/menghilangkannya?
Hilangkan baris MAILTO=… dari crontab Anda ?
Atau, usahakan tidak mengeluarkan output apa-apa maka tidak akan ada email yang tergenerate. Untuk membuang output sebuah perintah, Anda bisa menggunakan sintaks “>/dev/null” atau “2>&1 >/dev/null”. Contoh:
# ambil kurs dan masukkan ke database tiap 30 menit */30 * * * * /s/example.com/www/kurs.php >/dev/null
Tapi konsekuensinya juga Anda tidak bisa melihat/mendebug perintah Anda. Gunakan jika perlu.
Mengapa skrip PHP saya tidak berjalan jika dijalankan dari command line?
Contoh:
30 * * * * php /s/example.com/www/kurs.php
Skrip PHP ini dijalankan oleh PHP command line. Sementara cara ini:
30 * * * * lynx -dump http://example.com/kurs.php
Skrip PHP ini dijalankan via webserver menggunakan protokol CGI.
Kadang di dua lingkungan berbeda ini terdapat perbedaan konfigurasi sehingga PHP di command line tidak berjalan. Contohnya adalah php.ini. Di PHP CGI otomatis akan dibaca php.ini per-site yang ada di /s/example.com/etc/. Sementara jika Anda menggunakan PHP versi command line maka belum otomatis di-load. Untuk meload-nya gunakan opsi -c:
30 * * * * php -c /s/example.com/etc /s/example.com/www/kurs.php
Mungkin juga ada perbedaan-perbedaan atau asumsi lain dari skrip Anda yang menyebabkan versi command line tidak dapat berjalan (misalnya: ketergantungan pada variabel seperti $_SERVER yang hanya tersedia di versi CGI). Untuk mengetahui persisnya, silakan periksa lagi program Anda dan outputnya. Atau gunakan saja versi CGI seperti contoh di atas.
Bagaimana cara menjalankan sesuatu secara berkala yang lebih sering dari 1 menit sekali, misalnya 5 detik sekali?
Dengan cron tidak bisa, Anda bisa membuat sebuah proses yang berjalan terus-menerus (mis: sebuah daemon) yang setiap 5 detik menjalankan program yang diinginkan, misalnya (dalam pseudocode):
while (true) { sleep 5 do something }
Bagaimana menjalankan skrip php dengan query string di crontab?
Tambahkan petik ganda di URL skrip yang dijalankan.
* * * * * lynx -dump "http://example.com/Query.php?s=1"
Mengapa account saya didisable?
Kemungkinan karena crontab Anda mengandung perintah yang dijalankan terlalu sering dan/atau terlalu memberatkan server dan/atau menumpuk (lihat penjelasan item berikutnya), sehingga dinonaktifkan oleh admin server hosting atau oleh program monitoring. Silakan hubungi staf support kami jika Anda mengalami masalah ini.
Bagaimana menghindari proses bertumpuk?
Jika Anda menjalankan sebuah program/perintah, katakanlah setiap 10 menit sekali, lalu perintah terus belum selesai selama 10 menit (katakanlah programnya mendownload kurs mata uang atau headline berita dari Internet, lalu koneksi internetnya timeout atau sangat lambat), maka 10 menit berikutnya akan distart sebuah instans baru dan kini akan ada dua perintah berjalan. 10 menit kemudian dapat bertambah lagi menjadi 3, dst. Sehingga terjadi penumpukan.
Untuk mencegah penumpukan, program/perintah Anda perlu mengecek keberadaan dirinya. Jika instans sebelumnya masih berjalan, segera exit, jangan berjalan lagi. Biasanya hal ini dilakukan dengan PID file. Jika program Anda ditulis dalam Perl, bisa mencoba melihat Proc::PID::File.