Có gì sai với hai công việc định kỳ này?


13

Tôi có các công việc định kỳ sau được xác định.

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'

Nó dường như hoạt động đúng nếu tôi chạy nó lệnh trên trực tiếp từ dòng lệnh. Nhưng khi tôi kiểm tra việc chạy tập lệnh sáng nay tôi đã nhận được một email thông báo (tôi đang diễn giải vì tôi vô tình xóa chúng) rằng các dấu tích phía sau không được đóng đúng cách.


FYI Tôi vừa kiểm tra lại các công việc định kỳ và nhận được các lỗi sau. /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.
Đánh dấu

2
Backticks không được chấp nhận vì lý do này; thay đổi thành $(...)sẽ giúp bạn giải quyết các vấn đề trích dẫn ...
jasonwryan

1
Bạn chắc chắn muốn kiểm tra một câu hỏi của tôi. Nó có câu trả lời của Stephane Chazelas giải thích cách bạn có thể tạo một vỏ tương tác giống hệt với môi trường mà công việc định kỳ của bạn sẽ thấy. Nếu bạn thực hiện thủ tục nhỏ của anh ấy, bạn sẽ nhận được một lời nhắc và bạn có thể kiểm tra từng bước cronjob của mình và xem nó thất bại ở đâu. unix.stackexchange.com/a/56503/16841 Chắc chắn rằng nó không phù hợp 100% cho câu hỏi của bạn, nhưng nó có thể giúp bạn khắc phục sự cố crontab.
jippie

Câu trả lời:


14

Tôi thực sự khuyên bạn nên đặt bất kỳ công việc cron không tầm thường nào vào tệp script shell của riêng họ, vì nhiều lý do:

  • Dễ dàng gỡ lỗi hơn: bạn chỉ có thể chạy tập lệnh thay vì sao chép dán một dòng dài và với dòng shebang đúng, nó hoạt động dễ đoán hơn nhiều so với việc bạn có các lệnh tương tự trực tiếp trong crontab
  • Dễ đọc hơn: không cần phải biến nó thành 200 ký tự một ký tự, bạn có thể định dạng độc đáo để dễ đọc và dễ hiểu cho mọi người
  • Thêm tập lệnh vào kiểm soát phiên bản

8
Và việc đưa các %nhân vật rắc rối vào kịch bản sẽ ngăn không cho họ cronbiến thành dòng mới, đó là vấn đề thực sự của bạn.
Ian D. Allen

Tôi không đồng ý. Bạn có xu hướng quên đi kịch bản nào làm gì. Tôi đang nói về kinh nghiệm.
Sridhar Sarnobat

30

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 $PATHvà các biến dự kiến ​​khác bị thiếu.
  • Cron gọi /bin/shtheo 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 datelệ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ì datelệ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ế.

0

Bạn dường như đã lồng 'trong muttlệnh:

'Sự kiện từ date +%Y-%m-%d --date='last Wednesday'- date +%Y-%m-%d'

Hãy thử sử dụng "thay vì bên trong 'để câu lệnh đọc

'Sự kiện từ date +%Y-%m-%d --date="last Wednesday"- date +%Y-%m-%d'


Tôi không chắc đó là vấn đề gì. Nhưng sau khi cho nó một phát bắn trong cả hai công việc định kỳ, việc thực thi mà không thành công.
Đánh dấu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.