Làm thế nào để chuyển hướng đầu ra đến một tập tin từ trong cron?


105

Tôi có một tập lệnh sao lưu mà tôi cần chạy vào một thời điểm cụ thể trong ngày vì vậy tôi đang sử dụng croncho nhiệm vụ này và từ bên trong cron tôi cũng đang cố gắng chuyển hướng đầu ra của tập lệnh sao lưu sang a logfile.

crontab -e

*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log

Trong mục cron ở trên, tôi đang chuyển hướng cả hai stderr and stdoutđến một tệp nhật ký.

Công việc cron ở trên thực thi tốt theo syslog và nó thực hiện nhiệm vụ được đề cập trong backup.shtệp nhưng nó không ghi bất cứ điều gì vào tệp nhật ký.

/var/log/syslog

Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log)

Khi tôi chạy tập lệnh từ cli, nó hoạt động theo yêu cầu và đầu ra được ghi vào tệp nhật ký

ranveer@ranveer:~$ ./backup.sh &>> backup.log 
ranveer@ranveer:~$ cat backup.log
Fri Oct 19 20:28:01 IST 2012
successfully copied testdir
test.txt successfully copied
-------------------------------------------------------------------------------------
ranveer@ranveer:~$ 

Vì vậy, tại sao đầu ra của tệp không được chuyển hướng đến tệp từ bên trong cron.


Câu trả lời:


158

Tôi giải quyết vấn đề. Có hai cách:

M1

Thay đổi chuyển hướng từ &>>đến 2>&1. Vì vậy, bây giờ crontab -etrông giống như

*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1

Tôi tin rằng các công việc trên bởi vì theo mặc định cronlà sử dụng shđể chạy tác vụ thay bash&>>không được hỗ trợ bởi sh.

M2

Thay đổi shell mặc định bằng cách thêm SHELL=/bin/bashvào crontab -etập tin.


14
crongiống như sh: nó không chọn ra một chương trình duy nhất. Có nhiều triển khai. Việc thực hiện phổ biến nhất là Vixie cron. Tôi là tác giả (hiện tại, không phải là bản gốc) của người khác. Tôi tin rằng hầu hết các trình nền cron sẽ sử dụng hệ thống sh, nhưng điều đó có thể khác nhau trong việc nó có chấp nhận hay không &>>. Một số trình nền cron (như của tôi) không cho phép bạn thay đổi lớp vỏ nào thực thi các dòng cron bằng SHELL=...các dòng trong crontab. Tôi rất vui vì bạn đã tìm thấy một giải pháp phù hợp với bạn; chỉ nghĩ rằng nó đáng để chỉ ra rằng có nhiều biến số có thể ảnh hưởng đến việc nó có hoạt động cho người khác hay không.
dubiousjim

Làm thế nào để chèn YYYY-MM-DD_hh-mm-secvào tên tệp đầu ra, sao cho mỗi tên tệp khác nhau và được giữ mà không cần viết lại?
Danijel

1
@Danijel: Điều này sẽ giúp serverfault.com/questions/117360/
Khăn

2
*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.logcũng làm điều tương tự
Yanick Girouard

5

từ chối trách nhiệm [1].

Tôi muốn thêm chú thích hoặc phần phụ lục vào câu trả lời của @ RanRag .

Hãy chắc chắn rằng cú pháp chuyển hướng shell của bạn phù hợp với /bin/sh. Nếu bạn cố gắng sử dụng cú pháp chuyển hướng shell không hợp lệ /bin/shthì lệnh của bạn sẽ thất bại và công việc định kỳ của bạn sẽ không bao giờ chạy.

Trong /etc/cron.d/example1tệp cấu hình của bạn nếu bạn chỉ định người dùng khác rootvà vỏ đăng nhập của người dùng đó không /bin/bash... bạn vẫn phải sử dụng cú pháp / bin / sh trong /etc/cron.d/example1lệnh.


Ví dụ

Nếu người dùng của bạn có shell cshhoặc zshhoặc kshđặt cho shell đăng nhập của anh ta. Trong /etc/cron.d/example1tệp cấu hình của bạn , lệnh phải sử dụng /bin/shcú pháp. Cụ thể bất kỳ chuyển hướng shell phải được /bin/shcú pháp.

Nếu bạn cố gắng sử dụng cshcú pháp chuyển hướng shell chẳng hạn /etc/cron.d/example1, thì công việc định kỳ của bạn sẽ không bao giờ chạy. Logfile cho crondvị trí tại /var/log/cronsẽ nói rằng lệnh được chạy nhưng lệnh sẽ lỗi với lỗi cú pháp trước khi lệnh của bạn được chạy.

Trường hợp nào crondphát ra thông báo lỗi cho một lỗi cú pháp?

Các lỗi không bao giờ được báo cáo trong /var/log/cron. crondthay vào đó theo mặc định sẽ phát ra bất kỳ thông báo lỗi bằng cách sử dụng mail. Vì vậy, bạn phải kiểm tra /var/spool/mail/${USER}xem lỗi là gì.

[1]

Khước từ

  • Câu trả lời này giả định một sysvhệ thống
  • systemd thông tin có thể khác nhau
  • Cụ thể thông tin này đã được học cho centos-6distro và có thể không áp dụng cho các sysvdistro khác nhau
    • Tôi đề cập centos-6cụ thể, bởi vì các bản phân phối khác nhau có thể có cách crondtriển khai khác vớicentos-6

2
nếu bạn muốn /etc/cron.d/example1lệnh của mình sử dụng shell khác, bạn có thể sử dụng set set SHELL=trong /etc/cron.d/example1tệp cấu hình của mình .
Trevor Boyd Smith
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.