Làm thế nào để bạn đặt biến DATE để sử dụng trong nhật ký cho đầu ra crontab?


10

Tôi đã chơi aroudn với một số biến thể của ngày như

DATE = $(date)

nhưng nó cũng không hoạt động

crontab -e

CRONLOG=/tmp/log/crontab.log
DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
* * * * * echo $DATEVAR >> /tmp/log/crontab.log
*/2 * * * * echo "$DATEVAR hello" >> ${CRONLOG}
*/1 * * * * echo 'every minute' >> ${CRONLOG}

điều này chỉ xuất ra văn bản như là ...

Tôi muốn tạo một mục nhật ký trong crontab.log với dấu thời gian trên mỗi bản cập nhật

Làm thế nào tôi có thể làm điều này trên CentOS 6?

CẬP NHẬT

DATEVAR=date +20%y%m%d_%H%M%S
*/1 * * * * /bin/echo [CRON] $($(DATEVAR)) >> /tmp/log/crontab.log

chỉ hiển thị [CRON] và KHÔNG CÓ khi tôi dùng thử = /

Câu trả lời:


28

Cron không phải là shell - nó không phân tích các lệnh theo cách tương tự như shell. Như vậy, biến của bạn được gán như thể nó là văn bản tĩnh.

Có ba giải pháp tôi biết về vấn đề này:

Tùy chọn 1: Sử dụng tập lệnh shell để tạo lệnh của bạn, bao gồm bất kỳ biến và logic nào bạn muốn - và gọi tập lệnh shell đó từ cron.

* * * * * /path/to/myscript.sh

myscript.sh:

DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
echo $DATEVAR >> /tmp/crontab.log

Tùy chọn 2: Bao gồm lệnh ngày trực tiếp trong lệnh của bạn và, vì toàn bộ lệnh được chuyển đến trình bao, ngày sẽ được xử lý và thay thế bằng ngày thực tế.

* * * * * /bin/echo `date +20\%y\%m\%d_\%H\%M\%S` >> /tmp/crontab.log

Tùy chọn 3: Đặt biến chuỗi trong cron và truyền lệnh đó cho lệnh của bạn được xử lý (lưu ý - các dấu phần trăm không cần phải thoát và chính biến đó được bọc trong $ () để thực thi nó trong một vỏ riêng - backticks nên hoạt động như nhau):

DATEVAR=date +20%y%m%d_%H%M%S
* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

(Trong tất cả các trường hợp trên, tất nhiên, bạn có thể sử dụng một biến cho đường dẫn nhật ký, thay vì 'mã hóa cứng'.)


1
cảm ơn vì phản hồi tuyệt vời +1, tôi đã cố gắng thêm nó vào crontab nhưng làm việc đó không hiệu quả = / nó không bao giờ kết xuất DATEVAR
qodeninja

Tôi mới thực hiện điều này trên một hệ thống tương thích với RHEL / CentOS6 và nó đã cho kết quả như mong đợi (nghĩa là đã thêm một dòng mới vào tệp có ngày). Bạn đã thử tùy chọn nào (trong số 3 ở trên) và kết quả là gì - cụ thể - và có lỗi trong / var / log / cron không? (nếu bạn sử dụng tùy chọn kịch bản, a) đừng quên chmod + x và b) thử nó trên đầu tiên của riêng mình (tức là không thông qua cron))
cyberx86

1
tùy chọn 3 =], tôi đã thử làm điều đó trước đây nhưng nó không kết xuất. Nhưng bây giờ tôi nhận thấy bạn đã làm một cái gì đó khác. tại sao bạn tăng gấp đôi $ ($ (NGÀY))? xem cập nhật của tôi ở trên
qodeninja

1
Bạn có một lỗi đánh máy trong bản cập nhật bạn đã thêm - $($DATEVAR)không phải vậy $($(DATEVAR)). Hãy nghĩ về nó theo cách này - $()- nghĩa là, khung bên ngoài - khởi chạy một lớp vỏ mới để xử lý bất cứ thứ gì có trong ngoặc. Trong trường hợp này, biến $ DATEVAR được đặt thành một chuỗi và được truyền cho shell. $(DATEVAR)là không có gì - bởi vì DATEVARkhông có gì (nghĩa là nó thiếu $ để xác định nó là một biến). Bạn cũng có thể sử dụng backticks xung quanh $DATEVARđể có kết quả tương tự
cyberx86

đủ công bằng. đã cập nhật nó. Hãy thử cậu bé hư này! - Hazaaah! nó hoạt động lol
qodeninja
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.