2008-12-12 29 views
5

Tôi có một crontab trông giống nhưCó hạn chế đặc biệt nào đối với các lệnh do cron thực thi không?

0 0 * * * pg_dump DB_NAME > /path/to/dumps/`date +%Y%m%d`.dmp 

mà hoạt động tốt khi tôi chạy nó bằng tay, nhưng không phải khi cron chạy nó. Sau khi đào bới các bản ghi, tôi thấy

Dec 12 00:00:01 localhost crond[17638]: (postgres) CMD (pg_dump DB_NAME > /path/to/dumps/`date +) 

Nó trông giống như một vấn đề với dấu phần trăm, nhưng trang man thậm chí không chứa ký tự phần trăm nào cả, vì vậy tôi nghĩ họ đã ổn.

Trả lời

10

Bạn phải thoát khỏi dấu phần trăm với một dấu chéo ngược:

0 0 * * * pg_dump DB_NAME > /path/to/dumps/`date +\%Y\%m\%d`.dmp 

Từ man 5 crontab:

Các '' thứ sáu '' trường (phần còn lại của dòng) quy định các lệnh để được chạy. Toàn bộ phần lệnh của dòng, tối đa dòng mới hoặc% ký tự, sẽ được thực thi bởi/bin/sh hoặc theo hệ vỏ được chỉ định trong số SHELL biến của tệp crontab. Phần trăm dấu (%) trong lệnh , trừ khi được thoát bằng dấu gạch chéo ngược (\), sẽ được đổi thành dòng mới ký tự và tất cả dữ liệu sau% đầu tiên sẽ được gửi đến lệnh làm đầu vào tiêu chuẩn . Không có cách nào để tách một dòng lệnh đơn lẻ thành nhiều dòng, như dấu "\".

+0

Đúng vậy. Tôi đã nhìn vào trang người đàn ông sai (chỉ cần người đàn ông crontab thay vì người đàn ông 5 crontab). –

3

Có một vấn đề đặc trưng khác có thể ảnh hưởng đến các chương trình chạy bởi cron so với dòng lệnh (ngoài cách diễn giải '%' dấu hiệu được mô tả bởi Robert Gamble).

Sự khác biệt đó nằm trong môi trường. Nếu chương trình chạy dựa trên các biến môi trường đặc biệt, thì nó sẽ hoạt động khi bạn chạy nó từ dòng lệnh, với môi trường bạn thường sử dụng, và nó có khả năng hoạt động nếu bạn chạy nó với at vì nó nắm bắt môi trường khi bạn tạo việc làm. Nhưng cron không có cài đặt môi trường đặc biệt.

Do đó, theo thói quen, hãy định cấu hình cron để chạy tập lệnh theo tên đường dẫn tuyệt đối và tập lệnh đó thực hiện cài đặt môi trường mà tôi cần (ví dụ: thêm thư mục $HOME/bin vào PATH). Tôi thậm chí còn có một cơ sở hạ tầng tiêu chuẩn hóa cho điều này - một kịch bản trình bao đặt môi trường và chạy các chương trình khác.

# @(#)$Id: crontab,v 4.2 2007/09/17 02:41:00 jleffler Exp $ 
# Crontab file for Home Directory for Jonathan Leffler (JL) 
#----------------------------------------------------------------------------- 
#Min  Hour Day  Month Weekday Command 
#----------------------------------------------------------------------------- 
0  *  *  *  *  /usr/bin/ksh /work1/jleffler/bin/Cron/hourly 
1  1  *  *  *  /usr/bin/ksh /work1/jleffler/bin/Cron/daily 
23  1  *  *  1-5  /usr/bin/ksh /work1/jleffler/bin/Cron/weekday 
2  3  *  *  0  /usr/bin/ksh /work1/jleffler/bin/Cron/weekly 
21  3  1  *  *  /usr/bin/ksh /work1/jleffler/bin/Cron/monthly 

Các kịch bản trong /work1/jleffler/bin/Cron đặt môi trường và sau đó chạy kịch bản cùng tên trong /work1/jleffler/bin để làm công việc thực sự. Các tên trong thư mục con Cron thực sự là tất cả các liên kết đến cùng một tập lệnh.

Các vấn đề liên quan