Có ba nguyên nhân phổ biến khiến các lệnh cron hoạt động khác so với các lệnh được nhập trực tiếp vào vỏ tương tác, theo thứ tự phổ biến:
- Cron cung cấp một môi trường hạn chế, ví dụ, tối thiểu
$PATH
và các biến dự kiến khác bị thiếu.
- Cron gọi
/bin/sh
theo mặc định, trong khi bạn có thể đang sử dụng một số shell khác tương tác.
- Cron đối xử
%
đặc biệt với nhân vật (nó được chuyển thành một dòng mới trong lệnh).
- Cron không cung cấp một thiết bị đầu cuối hoặc môi trường đồ họa.
Bạn phải đặt trước tất cả các %
ký tự có \
tệp crontab, thông báo cho cron chỉ cần đặt phần trăm vào lệnh. Hãy nhớ rằng khi bạn sử dụng date
lệnh trong một công việc định kỳ.
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"
Tôi cũng đã sửa một số vấn đề trích dẫn:
- Điều này không gây ra cho bạn các vấn đề khác ngoài mức độ dễ đọc, nhưng bạn không nên sử dụng backticks để thay thế lệnh. Sử dụng
$(…)
thay thế: quy tắc phân tích cú pháp của nó đơn giản hơn.
- Luôn luôn sử dụng dấu ngoặc kép quanh biến và lệnh thay thế:
"$somevariable"
, "$(somecommand)"
. Ở đây, việc thiếu dấu ngoặc kép là vô hại vì date
lệnh không bao giờ trả lại bất kỳ ký tự đặc biệt nào cho các định dạng bạn đã sử dụng, nhưng bạn phải nhớ cẩn thận những ký tự nào là đặc biệt và kiểm tra điều này mỗi khi bạn không thay thế. Giữ cho nó đơn giản, luôn luôn sử dụng dấu ngoặc kép trừ khi bạn muốn tách trường và tạo tên tệp xảy ra trên kết quả.
- Bạn đã có một số trích dẫn ngăn chặn mở rộng xung quanh một số thay thế lệnh. Sử dụng dấu ngoặc kép thay thế.
/bin/sh: 1: Syntax error: EOF in backquote substitution
Đối với công việc cron đầu tiên./bin/sh: 1: Syntax error: Unterminated quoted string
Đối với công việc định kỳ thứ hai.