Sử dụng ngày / giờ hệ thống trong Tập lệnh Cron


37

Tôi đang thiết lập một Cronjob sẽ sao lưu cơ sở dữ liệu MySQL mà tôi có trong máy chủ của mình, nhưng tôi không muốn nó tiếp tục ghi đè lên cùng một tệp nhiều lần. Thay vào đó, tôi muốn có một loạt các bản sao lưu để lựa chọn, được thực hiện tự động. Ví dụ:

## Cronjob, run May 21st, 2011:
mysqldump -u username -ppasword database > /path/to/file/21-03-2011.sql

## SAME Conjob, run May 28th, 2011:
mysqldump -u username -ppasword database > /path/to/file/28-03-2011.sql

Và như vậy.

Có cách nào để tôi có thể sử dụng ngày và / hoặc thời gian của hệ thống như một loại biến trong Cronjob của mình không? Nếu không, đề xuất của bạn để thực hiện cùng là gì?

Câu trả lời:


45

Bạn có thể thử một cái gì đó như thế này (như glenn jackmann ghi chú bên dưới, bạn phải thoát tất cả các %ký tự):

15 11 * * * touch "/tmp/$(date +\%d-\%m-\%Y).sql"

Để xem liệu cron cụ thể của bạn sẽ chạy lệnh ra khỏi crontab dưới dạng tập lệnh trong chính nó hay nếu bạn cần viết một tập lệnh xác định ngày tháng dưới dạng chuỗi, sau đó chạy lệnh mysqldump của bạn.

Không thoát khỏi %"cron" trên Redhat Enterprise Linux 5.0 (tôi nghĩ) tiếp tục gây ra lỗi cho tôi về việc không tìm thấy kết quả khớp ). Điều này là do mọi thứ sau khi không thoát %được gửi đến đầu vào tiêu chuẩn của lệnh.

Tôi cũng sẽ đưa ra khuyến nghị sử dụng định dạng ngày ISO8601 (yyyy-mm-dd, nghĩa là %F) để sắp xếp tên tệp theo ngày khi được sắp xếp theo từ vựng.


23
Phải cẩn thận với datebên trong một cronfile: một số crons (tất cả?) Coi %như là kết thúc của lệnh. (vì vậy $()không phải là vấn đề). Bạn phải thoát tất cả các dấu hiệu phần trăm: ... touch "/tmp/$(date +\%Y-\%m-\%d)"(đẹp hơn để sử dụng định dạng ngày sắp xếp theo từ vựng)
glenn jackman

2
glenn jackman là chính xác: thoát các ký tự '%' trong mục crontab ở trên hoạt động. Một mục crontab của RHEL 5.0 trông như thế này: 50 11 * * * chạm "/tmp/backup.$(date + \% Y - \% m - \% d) .sql"
Bruce Ediger

Điều đáng chú ý là việc sử dụng một lớp con không hoạt động trong một biến môi trường. Vì vậy, DATE=$( date -I )và sau đó sử dụng ${DATE}kết quả sau này bằng cách sử dụng một nghĩa đen $( date -I )trong dòng lệnh của công việc.
Christopher Schultz

1
Có vẻ như việc thoát ra %là cần thiết trên OpenSuse 42.
kgadek

7

Bạn sẽ có thể sử dụng date.
Nhập info datehoặc man dateđể biết chi tiết.

Một cái gì đó như sau có thể phù hợp với bạn (thay đổi định dạng ngày theo nhu cầu của bạn)

yourcommand > filepathandnameprefix$(date +"\%d-\%m-\%Y").extension

Một lần nữa, hãy cẩn thận để thoát khỏi tất cả các %ký tự bên trong cron.
glenn jackman

@glenn: Rất tiếc, chắc chắn rồi. Đối với thứ tự từ điển, tôi chỉ khớp với định dạng ngày của OP. Cá nhân tôi thích định dạng ISO, giống như bạn.
asoundmove


1

Đây là tập lệnh bash tôi đã sử dụng:

#!/bin/bash
mysqldump -u user1 -p DatabaseName | gzip > BackupFolder/backup`date +%F_%T`.sql.gz

Các tập tin trông như:

backup2011-03-02_15:16:46.sql.gz

Chỉ công việc cron vào lúc này để chạy hàng đêm hoặc bất cứ điều gì bạn thích.


Công việc này như một cái duyên vậy. Mặc dù, tôi không hiểu những gì đang xảy ra ở đây. Liệu các backticks cho phép bao gồm đầu ra của các chương trình khác hoặc một cái gì đó? Còn định dạng (như +% F và như vậy) thì sao?
AeroCross

1
Yep các backticks thực hiện thay thế lệnh trong đó đầu ra được thay thế cho chính lệnh đó. Tham khảo Mục 3.4.5 Dưới đây là danh sách các công cụ sửa đổi toàn diện hơn cho liên kết

Ồ, wow, đó là một nguồn tài nguyên tuyệt vời. Thật tuyệt khi luôn tiếp tục học hỏi. Cảm ơn bạn rất nhiều về đường link dẫn!
AeroCross

0

Viết một tập lệnh bao bọc nhỏ sử dụng datelệnh và gọi lệnh sao lưu của bạn.

#!/bin/bash
NOW=`/bin/date +"%m%d%Y-%H%M%S"`
if [[ "$?" != "0" ]]; then
 NOW="UNKNOWN_DATE"
 fi
mysqldump -u username -ppassword database > /path/to/file/$NOW.sql
if [[ "$?" != "0" ]]; then
 echo "$0: backup failed with error code $?"
 fi
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.