Pertanyaan Mengapa skrip crontab tidak berfungsi?
Sering, crontab
skrip tidak dijalankan sesuai jadwal atau seperti yang diharapkan. Ada banyak alasan untuk itu:
- notasi crontab yang salah
- masalah perizinan
- variabel lingkungan
Komunitas ini bertujuan untuk mengumpulkan alasan utama crontab
skrip tidak dieksekusi seperti yang diharapkan. Tuliskan setiap alasan dalam jawaban yang berbeda.
Harap sertakan satu alasan per jawaban - detail tentang mengapa itu tidak dilaksanakan - dan perbaiki (es) untuk satu alasan itu.
Harap tulis hanya masalah khusus cron, mis. perintah yang dieksekusi seperti yang diharapkan dari shell tetapi dieksekusi secara salah oleh cron.
454
asal
Jawaban:
Lingkungan yang berbeda
Cron mengirimkan sejumlah variabel lingkungan minimal ke pekerjaan Anda. Untuk melihat perbedaannya, tambahkan pekerjaan tiruan seperti ini:
* * * * * env> /tmp/env.output
Tunggu sebentar /tmp/env.output
untuk dibuat, lalu hapus pekerjaan itu lagi. Sekarang bandingkan isi /tmp/env.output
dengan output env
jalankan di terminal reguler Anda.
"Gotcha" umum di sini adalah PATH
variabel lingkungan menjadi berbeda. Mungkin skrip cron Anda menggunakan perintah somecommand
ditemukan di /opt/someApp/bin
, yang telah Anda tambahkan PATH
di /etc/environment
? cron mengabaikan PATH
dari file itu, jadi runnning somecommand
dari skrip Anda akan gagal ketika dijalankan dengan cron, tetapi bekerja ketika dijalankan di terminal. Ini perlu dicatat bahwa variabel dari /etc/environment
akan diteruskan ke cron jobs, tidak hanya variabel cron yang secara spesifik mengatur dirinya sendiri, seperti PATH
.
Untuk menyiasati itu, cukup tetapkan sendiri PATH
variabel di bagian atas skrip. Misalnya.
#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# rest of script follows
Beberapa lebih suka hanya menggunakan jalur absolut untuk semua perintah sebagai gantinya. Saya merekomendasikan hal itu. Pertimbangkan apa yang terjadi jika Anda ingin menjalankan skrip Anda pada sistem yang berbeda, dan pada sistem itu, perintahnya masuk /opt/someAppv2.2/bin
sebagai gantinya. Anda harus melalui seluruh skrip yang diganti /opt/someApp/bin
dengan /opt/someAppv2.2/bin
daripada hanya melakukan pengeditan kecil di baris pertama skrip.
Anda juga dapat mengatur variabel PATH di file crontab, yang akan berlaku untuk semua pekerjaan cron. Misalnya.
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
15 1 * * * backupscript --incremental /home /root
431
Gotcha atas saya: Jika Anda lupa menambahkan baris baru di akhir crontab
mengajukan. Dengan kata lain, file crontab harus diakhiri dengan baris kosong.
Di bawah ini adalah bagian yang relevan di halaman manual untuk masalah ini (man crontab
kemudian lewati sampai akhir):
Although cron requires that each entry in a crontab end in a newline
character, neither the crontab command nor the cron daemon will detect
this error. Instead, the crontab will appear to load normally. However,
the command will never run. The best choice is to ensure that your
crontab has a blank line at the end.
4th Berkeley Distribution 29 December 1993 CRONTAB(1)
291
Cron daemon tidak berjalan. Saya benar-benar gagal dengan ini beberapa bulan yang lalu.
Mengetik:
pgrep cron
Jika Anda tidak melihat angka, cron tidak berjalan. sudo /etc/init.d/cron start
dapat digunakan untuk memulai cron.
EDIT: Daripada memohon skrip init melalui /etc/init.d, gunakan layanan
utilitas, mis.
sudo service cron start
125
Nama file skrip di cron.d/
, cron.daily/
, cron.hourly/
, dll., tidak boleh mengandung titik (.
), jika tidak, run-parts akan melewati mereka.
Lihat run-bagian (8):
If neither the --lsbsysinit option nor the --regex option is given then
the names must consist entirely of upper and lower case letters, dig‐
its, underscores, and hyphens.
If the --lsbsysinit option is given, then the names must not end in
.dpkg-old or .dpkg-dist or .dpkg-new or .dpkg-tmp, and must belong to
one or more of the following namespaces: the LANANA-assigned namespace
(^[a-z0-9]+$); the LSB hierarchical and reserved namespaces
(^_?([a-z0-9_.]+-)+[a-z0-9]+$); and the Debian cron script namespace
(^[a-zA-Z0-9_-]+$).
Jadi, jika Anda memiliki skrip cron backup.sh
, analyze-logs.pl
di cron.daily/
direktori, Anda sebaiknya menghapus nama ekstensi.
83
Di banyak lingkungan, cron menjalankan perintah menggunakan sh
, sementara banyak orang menganggap itu akan digunakan bash
.
Saran untuk menguji atau memperbaiki ini untuk perintah yang gagal:
- Coba jalankan perintah di
sh
untuk melihat apakah itu berhasil
- Bungkus perintah dalam subkulit bash untuk memastikannya dijalankan di bash:
bash -c "mybashcommand"
- Beritahu cron untuk menjalankan semua perintah di bash dengan mengatur shell di bagian atas crontab Anda:
SHELL=/bin/bash
- Jika perintahnya adalah skrip, pastikan skrip berisi shebang:
#!/bin/bash
55
Saya memiliki beberapa masalah dengan zona waktu. Cron berlari dengan zona waktu instalasi yang baru. Solusinya adalah memulai ulang cron:
sudo service cron restart
34
Jika perintah crontab Anda memiliki %
simbol di dalamnya, cron mencoba menafsirkannya. Jadi jika Anda menggunakan perintah apa pun dengan %
di dalamnya (seperti spesifikasi format untuk perintah tanggal) Anda harus meloloskannya.
Itu dan gotchas baik lainnya di sini:
http://www.pantz.org/software/cron/croninfo.html
29
Jalur absolut harus digunakan untuk skrip:
Sebagai contoh, /bin/grep
sebaiknya digunakan sebagai gantinya grep
:
# m h dom mon dow command
0 0 * * * /bin/grep ERROR /home/adam/run.log &> /tmp/errors
Dari pada:
# m h dom mon dow command
0 0 * * * grep ERROR /home/adam/run.log &> /tmp/errors
Ini sangat rumit, karena perintah yang sama akan berfungsi ketika dijalankan dari shell. Alasannya adalah itu cron
tidak memiliki hal yang sama PATH
variabel lingkungan sebagai pengguna.
28
Mungkin juga kata sandi pengguna telah kedaluwarsa. Bahkan kata sandi root bisa kadaluwarsa. Kamu bisa tail -f /var/log/cron.log
dan Anda akan melihat cron gagal dengan kata sandi kadaluarsa. Anda dapat mengatur kata sandi agar tidak pernah kedaluwarsa dengan melakukan ini: passwd -x -1 <username>
Di beberapa sistem (Debian, Ubuntu) penebangan untuk cron tidak diaktifkan secara default. Di /etc/rsyslog.conf atau /etc/rsyslog.d/50-default.conf garis:
# cron.* /var/log/cron.log
harus diedit (sudo nano /etc/rsyslog.conf
) tanpa komentar ke:
cron.* /var/log/cron.log
Setelah itu, Anda perlu me-restart rsyslog via
/etc/init.d/rsyslog restart
atau
service rsyslog restart
Sumber: Aktifkan penebangan crontab di Debian Linux
Di beberapa sistem (Ubuntu) file penebangan terpisah untuk cron tidak diaktifkan secara default, tetapi log terkait cron muncul dalam file syslog. Satu dapat digunakan
cat /var/log/syslog | grep cron
untuk melihat pesan terkait cron.
23