Kemungkinan besar, cron berjalan di lingkungan yang sangat jarang. Periksa variabel lingkungan yang digunakan cron dengan menambahkan pekerjaan dummy yang membuang env
ke file seperti ini:
* * * * * env > env_dump.txt
Bandingkan dengan output dari env
dalam sesi shell normal.
Anda dapat menambahkan variabel lingkungan Anda sendiri ke crontab lokal dengan mendefinisikannya di bagian atas crontab Anda.
Inilah perbaikan cepat untuk menambahkan $PATH
ke crontab saat ini:
# echo PATH=$PATH > tmp.cron
# echo >> tmp.cron
# crontab -l >> tmp.cron
# crontab tmp.cron
Crontab yang dihasilkan akan terlihat mirip dengan jawaban chrissygormley, dengan PATH ditentukan sebelum aturan crontab.
Anda harus meletakkan jalur lengkap di crontab
Anda . Itu pilihan yang paling aman.
Jika Anda tidak ingin melakukannya, Anda dapat meletakkan skrip pembungkus di sekitar program Anda, dan menyetel PATH di sana.
mis.
01 01 * * * command
menjadi:
01 01 * * * /full/path/to/command
Juga apa pun yang dipanggil dari cron
harus sangat berhati-hati dengan program yang dijalankannya, dan mungkin menetapkan pilihannya sendiri untuk PATH
variabel.
EDIT:
Jika Anda tidak tahu di mana perintahnya, Anda ingin menjalankan which <command>
dari shell Anda dan itu akan memberi tahu Anda jalannya.
EDIT2:
Jadi setelah program Anda berjalan, hal pertama yang harus dilakukan adalah menyetel PATH
dan variabel lain yang diperlukan (mis. LD_LIBRARY_PATH
) ke nilai yang diperlukan untuk menjalankan skrip.
Pada dasarnya, alih-alih memikirkan cara memodifikasi lingkungan cron agar lebih cocok untuk program/skrip Anda - buat skrip Anda menangani lingkungan yang diberikannya, dengan menyetel lingkungan yang sesuai saat dimulai.
Saya menggunakan /etc/crontab
. Saya menggunakan vi
dan memasukkan PATH yang saya butuhkan ke dalam file ini dan menjalankannya sebagai root. Crontab normal menimpa PATH yang telah Anda atur. Tutorial yang bagus tentang cara melakukannya.
File cron seluruh sistem terlihat seperti ini:
This has the username field, as used by /etc/crontab.
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file.
# This file also has a username field, that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
42 6 * * * root run-parts --report /etc/cron.daily
47 6 * * 7 root run-parts --report /etc/cron.weekly
52 6 1 * * root run-parts --report /etc/cron.monthly
01 01 * * 1-5 root python /path/to/file.py