Làm thế nào tôi có thể thực thi `date` bên trong công việc tab cron?


117

Tôi muốn tạo một tệp nhật ký cho tập lệnh cron có giờ hiện tại trong tên tệp nhật ký. Đây là lệnh tôi đã cố sử dụng:

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log

Thật không may, tôi nhận được thông báo này khi nó chạy:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

Tôi đã cố gắng thoát khỏi datephần này bằng nhiều cách khác nhau, nhưng không gặp nhiều may mắn. Có thể thực hiện điều này xảy ra trong dòng trong tệp crontab hay tôi cần tạo một tập lệnh shell để làm điều này?

Câu trả lời:


180

Câu trả lời ngắn:

Thoát khỏi %như \%:

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+\%d"`.log

Câu trả lời dài:

Thông báo lỗi cho thấy trình bao thực thi lệnh của bạn không nhìn thấy ký tự đánh dấu trở lại thứ hai:

/bin/sh: -c: line 0: unexpected EOF while looking for matching '`'

Điều này cũng được xác nhận bởi thông báo lỗi thứ hai mà bạn nhận được khi bạn thử một trong những câu trả lời khác:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ')'

Trang chủ crontab xác nhận rằng lệnh chỉ được đọc tối đa cho %dấu hiệu không thoát đầu tiên :

Trường "thứ sáu" (phần còn lại của dòng) chỉ định lệnh sẽ được chạy. Toàn bộ phần lệnh của dòng, cho đến một dòng hoặc %ký tự mới, sẽ được thực thi bởi /bin/shhoặc bởi trình bao được chỉ định trong SHELLbiến của cronfile. Phần trăm dấu ( %) trong lệnh, trừ khi thoát bằng dấu gạch chéo ngược ( \), sẽ được thay đổi thành ký tự dòng mới và tất cả dữ liệu sau lần đầu tiên %sẽ được gửi đến lệnh dưới dạng đầu vào tiêu chuẩn.


Xin lỗi vì sự thiếu hiểu biết của tôi, nhưng bạn thấy thông báo lỗi này ở đâu? Khi tôi thực hiện 'grep CRON / var / log / syslog', tôi không thấy thông báo lỗi nào, mặc dù cron không thành công - kagda.ru/i/9a016249a39_20-05-2015-09:22:47_9a01.png
Tebe

2
@ Копать_Шо_я_нашел cron sẽ gửi một email với các thông báo lỗi,
Jasen

3
date +\%Y\ \%m\ \%d\ \%H:\%M:\%S-cronlog
DevilCode

7

Bạn cũng có thể đặt các lệnh của mình vào một tệp shell và sau đó thực thi tệp shell bằng cron.

việc làm

echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log

cron

0 * * * * sh jobs.sh

6

Nếu bạn muốn biến chuỗi định dạng ngày thành một biến (để tránh trùng lặp toàn bộ chuỗi), KHÔNG thoát %KHÔNG đặt chuỗi đó vào$()

Ví dụ, trong khi khai báo chuỗi, chỉ cần viết:

DATEVAR=date +%Y%m%d_%H%M%S

Sau đó, viết câu lệnh cron với $($VARIABLE_NAME)như thế này:

* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

Nhờ cyberx86 , câu trả lời của cô ấy / anh ấy tại ServerFault có thể được hoàn thành nhiều hơn:


1
DATEVAR = "ngày +% Y% m% d_% H% M% S"
Frank Fang

3

Trong cron, bạn có thể sử dụng cú pháp đơn giản này:

*/15 01-09 * * * sh /script.sh >> /home/username/cron_$(date -d"-0 days" +\%Y\%m\%d).log 2>&1

Định dạng ngày đầu ra sẽ truy xuất như cron_20180123.log
bala4rtraining

(1) Bạn đang nói gì mà chưa được trả lời bởi câu trả lời được chấp nhận? (2) Câu trả lời của bạn phức tạp hơn nhiều so với câu hỏi. Ví dụ: bạn đã thêm -dtùy chọn không được sử dụng trong câu hỏi (và bạn không giải thích về nó). Làm thế nào để bạn biện minh cho việc gọi cú pháp đơn giản này
G-Man

2

Tất cả các câu trả lời trên đều sử dụng dấu ngoặc kép (không phải tất cả chúng đều hoạt động cho thiết lập của tôi). Điều này làm việc cho tôi:

0 5 * * 3 /data/script.sh > /data/script_`date +\%y\%m\%d`.log 2>&1

1
Bạn đang nói gì mà chưa được trả lời bởi câu trả lời được chấp nhận? Bạn đang nói rằng nó hoạt động tốt hơn mà không có dấu ngoặc kép so với dấu ngoặc kép? (Gợi ý: điều đó rất khó xảy ra.)
G-Man

Câu trả lời được chấp nhận đơn giản là không hiệu quả với tôi. Cái này nào.
Manuel Schmitzberger 23/12/18

0

Một giải pháp cơ bản:

  • sử dụng $()để thực hiện datelệnh và trả lại đầu ra
  • định dạng datetime sang UTC, thoát %ký tự với\
  • thêm 2>&1vào cuối để truyền phát cả hai stdoutstderrvào tệp nhật ký đó

Thí dụ:

* * * * * echo "Test crontab log" > /tmp/crontab.log.$(date --utc +\%Y\%m\%d_\%H\%M\%SZ) 2>&1

Đầu ra:

ls -lh /tmp | grep log

-rw-rw-r-- 1 ubuntu  ubuntu    17 May  4 05:06 crontab.log.20190504_050601Z
-rw-rw-r-- 1 ubuntu  ubuntu    17 May  4 05:07 crontab.log.20190504_050701Z
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.