Ada tiga penyebab umum untuk perintah pekerjaan cron untuk berperilaku berbeda dibandingkan dengan perintah yang diketik langsung ke shell interaktif, dalam urutan umum kesamaan:
- Cron menyediakan lingkungan terbatas, mis. Minimal
$PATH
, dan variabel-variabel lain yang diharapkan hilang.
- Cron memanggil
/bin/sh
secara default, sedangkan Anda mungkin menggunakan beberapa shell lain secara interaktif.
- Cron memperlakukan
%
karakter secara khusus (itu diubah menjadi baris baru dalam perintah).
- Cron tidak menyediakan lingkungan terminal atau grafis.
Anda harus mendahului semua %
karakter dengan \
file crontab, yang memberitahu cron untuk hanya menempatkan persen dalam perintah. Ingatlah bahwa ketika Anda menggunakan date
perintah dalam pekerjaan cron.
55 8 * * 3 /usr/bin/php /home/mark/dev/processes/customClient/events.php > "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
0 9 * * 3 /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s "Events from $(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d)" -a "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
Saya juga memperbaiki beberapa masalah penawaran:
- Ini tidak menyebabkan Anda masalah selain dengan keterbacaan, tetapi Anda tidak boleh menggunakan backtick untuk substitusi perintah. Gunakan
$(…)
sebaliknya: aturan parsingnya lebih sederhana.
- Selalu gunakan tanda kutip ganda di sekitar penggantian variabel dan perintah:
"$somevariable"
, "$(somecommand)"
. Di sini, kurangnya tanda kutip tidak berbahaya karena date
perintah tidak pernah mengembalikan karakter khusus untuk format yang Anda gunakan, tetapi Anda harus hati-hati mengingat karakter mana yang spesial dan periksa ini setiap kali Anda meninggalkan subtitusi yang tidak dikutip. Tetap sederhana, selalu gunakan tanda kutip ganda kecuali jika Anda ingin pemisahan bidang dan pembuatan nama file terjadi pada hasilnya.
- Anda memiliki beberapa kutipan tunggal yang mencegah ekspansi di sekitar beberapa penggantian perintah. Gunakan tanda kutip ganda sebagai gantinya.
/bin/sh: 1: Syntax error: EOF in backquote substitution
Untuk pekerjaan cron pertama./bin/sh: 1: Syntax error: Unterminated quoted string
Untuk pekerjaan cron kedua.