WTF?! Cronjob saya tidak berjalan?!
Berikut adalah panduan checklist untuk men-debug cronjobs yang tidak berjalan:
- Apakah daemon Cron berjalan?
- Jalankan
ps ax | grep cron
dan cari cron. - Debian:
service cron start
atauservice cron restart
- Apakah cron berfungsi?
* * * * * /bin/echo "cron works" >> /tmp/file
- Sintaks benar? Lihat di bawah.
- Anda jelas perlu memiliki akses tulis ke file yang Anda alihkan hasilnya. Nama file unik di
/tmp
yang saat ini tidak ada harus selalu dapat ditulis. - Mungkin juga menambahkan
2>&1
untuk memasukkan kesalahan standar serta keluaran standar, atau mengeluarkan kesalahan standar secara terpisah ke file lain dengan2>>/tmp/errors
- Apakah perintah bekerja mandiri?
- Periksa apakah skrip memiliki kesalahan, dengan melakukan uji coba pada CLI
- Saat menguji perintah Anda, uji sebagai pengguna yang crontabnya sedang Anda edit, yang mungkin bukan login atau root Anda
- Bisakah cron menjalankan pekerjaan Anda?
- Periksa
/var/log/cron.log
atau/var/log/messages
untuk kesalahan. - Ubuntu:
grep CRON /var/log/syslog
- Redhat:
/var/log/cron
- Periksa izin
- Atur flag yang dapat dieksekusi pada perintah:
chmod +x /var/www/app/cron/do-stuff.php
- Jika Anda mengalihkan keluaran perintah ke file, pastikan Anda memiliki izin untuk menulis ke file/direktori tersebut
- Periksa jalur
- Periksa baris she-bangs / hashbangs
- Jangan mengandalkan variabel lingkungan seperti
PATH
, karena nilainya kemungkinan tidak akan sama di bawah cron seperti di sesi interaktif. Lihat Cara membuat CRON memanggil PATH yang benar
- Jangan menekan keluaran saat melakukan debug
- Yang umum digunakan adalah supresi ini:
30 1 * * * command > /dev/null 2>&1
- Aktifkan kembali keluaran standar atau keluaran pesan kesalahan standar dengan menghapus
>/dev/null 2>&1
sama sekali; atau mungkin mengalihkan ke file di lokasi di mana Anda memiliki akses tulis:>>cron.out 2>&1
akan menambahkan keluaran standar dan kesalahan standar kecron.out
di direktori home pengguna yang memohon. - Jika Anda tidak mengalihkan output dari
cron
pekerjaan, daemon akan mencoba mengirimi Anda keluaran atau pesan kesalahan apa pun melalui email. Periksa kotak masuk Anda (mungkin hanyamore $MAIL
jika Anda tidak memiliki klien email). Jika email tidak tersedia, mungkin periksa file bernamadead.letter
di direktori home Anda, atau entri log sistem yang mengatakan bahwa output telah dibuang. Terutama dalam kasus terakhir, mungkin mengedit tugas untuk menambahkan pengalihan ke file, lalu menunggu tugas berjalan, dan memeriksa file log untuk melihat pesan kesalahan atau umpan balik berguna lainnya. - Jika Anda mencoba mencari tahu mengapa sesuatu gagal, pesan kesalahan akan terlihat di file ini. Baca dan pahami.
Masih belum berfungsi? Astaga!
- Naikkan level debug cron
- Debian
- di
/etc/default/cron
- setel
EXTRA_OPTS="-L 2"
service cron restart
tail -f /var/log/syslog
untuk melihat skrip dijalankan
- di
- Ubuntu
- di
/etc/rsyslog.d/50-default.conf
- tambahkan atau komentari baris
cron.* /var/log/cron.log
- muat ulang pencatat
sudo /etc/init.d/rsyslog restart
- jalankan kembali cron
- buka
/var/log/cron.log
dan cari keluaran kesalahan mendetail
- di
- Pengingat:nonaktifkan level log, saat Anda selesai melakukan debug
- Jalankan cron dan periksa lagi file log
Sintaks Cronjob
# Minute Hour Day of Month Month Day of Week User Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat)
0 2 * * * root /usr/bin/find
Sintaks ini hanya benar untuk root
pengguna. Pengguna biasa crontab
sintaks tidak memiliki Pengguna bidang (pengguna biasa tidak diizinkan menjalankan kode seperti pengguna lainnya);
# Minute Hour Day of Month Month Day of Week Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat)
0 2 * * * /usr/bin/find
Perintah Crontab
crontab -l
- Mencantumkan semua tugas cron pengguna.
crontab -e
, untuk pengguna tertentu:crontab -e -u agentsmith
- Memulai sesi edit file crontab Anda.
- Saat Anda keluar dari editor, crontab yang dimodifikasi akan diinstal secara otomatis.
crontab -r
- Menghapus entri crontab Anda dari spooler cron, tetapi bukan dari file crontab.
Saya ingin menambahkan 2 poin yang saya pelajari:
- Berkas konfigurasi cron yang dimasukkan ke dalam /etc/cron.d/ tidak boleh berisi titik (.). Jika tidak, itu tidak akan dibaca oleh cron.
- Jika pengguna yang menjalankan perintah Anda tidak ada di /etc/shadow. Itu tidak akan diizinkan untuk menjadwalkan cron.
Referensi:
- http://manpages.ubuntu.com/manpages/xenial/en/man8/cron.8.html
- https://help.ubuntu.com/community/CronHowto
Akhirnya saya menemukan solusinya. Berikut solusinya:-
-
Jangan pernah menggunakan jalur relatif dalam skrip python untuk dieksekusi melalui crontab. Saya malah melakukan hal seperti ini:-
import os import sys import time, datetime CLASS_PATH = '/srv/www/live/mainapp/classes' SETTINGS_PATH = '/srv/www/live/foodtrade' sys.path.insert(0, CLASS_PATH) sys.path.insert(1,SETTINGS_PATH) import other_py_files
-
Jangan pernah menekan kode crontab alih-alih gunakan server surat dan periksa surat untuk pengguna. Itu memberikan wawasan yang lebih jelas tentang apa yang sedang terjadi.
Alasan lain crontab akan gagal:Penanganan khusus %
karakter.
Dari file manual:
The entire command portion of the line, up to a newline or a
"%" character, will be executed by /bin/sh or by the shell specified
in the SHELL variable of the cronfile. A "%" character in the
command, unless escaped with a backslash (\), will be changed into
newline characters, and all data after the first % will be sent to
the command as standard input.
Dalam kasus khusus saya, saya menggunakan date --date="7 days ago" "+%Y-%m-%d"
untuk menghasilkan parameter pada skrip saya, dan gagal secara diam-diam. Saya akhirnya menemukan apa yang terjadi ketika saya memeriksa syslog
dan melihat perintah saya terpotong di %
simbol. Anda harus menghindarinya seperti ini:
date --date="7 days ago" "+\%Y-\%m-\%d"
Lihat di sini untuk detail selengkapnya:
http://www.ducea.com/2008/11/12/using-the-character-in-crontab-entries/