rsync hoạt động tốt cho đến khi tôi đặt nó vào crontab (CẬP NHẬT: 'ngày' không hoạt động trong crontab)


3

Tôi đã nhận được rsynclệnh này chỉ hoạt động tốt khi tôi chạy nó từ dòng lệnh (Ubuntu Server 12.04.1 LTS). Tôi muốn nó chạy mỗi giờ, mỗi giờ và xuất kết quả (cùng với lỗi) vào một tệp nhật ký. Đây là lệnh tôi đã đưa vào crontab:

0 * * * * root rsync -av --delete -e "ssh -i /root/.ssh/id_rsa" 
user@host:/path/to/dir/ user@host:/path/to/another/dir/ /destination/dir
--exclude='.DS_Store' &> /var/log/backup/`date '+%Y_%m_%d_%H:%M'`_hourlybackup.log

Mặc dù hoạt động chính xác như tôi mong đợi từ bash, nhưng không có gì xảy ra khi nó ở crontab. Nó thậm chí không ghi bất kỳ lỗi nào vào tập tin. Chạy ps aux | grep rsynccho thấy không có gì quan tâm. Tôi dường như không thể tìm thấy vấn đề. Có ý kiến ​​gì không?

CẬP NHẬT: Nhờ các câu trả lời tôi nhận được, tôi có thể điều chỉnh lệnh để nó hoạt động chính xác, mặc dù không ai trong số họ tự giải quyết vấn đề. Đây là những gì tôi tìm thấy hoạt động sáng nay:

0 * * * * /usr/bin/rsync -av --delete -e "ssh -i /root/.ssh/id_rsa" 
user@host:/path/to/dir/ user@host:/path/to/another/dir/ /destination/dir
--exclude='.DS_Store' > /var/log/backup/_hourlybackup.log 2>&1   

Vì một số lý do, date '+%Y_%m_%d_%H:%M'(kèm theo backticks) đang gây ra vấn đề. Nếu tôi loại bỏ nó khỏi lệnh, nó sẽ hoạt động tốt ... mặc dù điều quan trọng với tôi là tôi có nhật ký sao lưu toàn diện, vì vậy tôi vẫn muốn tìm giải pháp cho vấn đề này. Tôi sẽ tiếp tục hack nó, nhưng nếu có ai biết, hãy là khách của tôi.


Mà crontab bạn đã đặt cái này vào?
Paul

Tôi đặt nó trong root, sử dụng sudo crontab -e. Tôi nhận ra rằng tôi đã phạm sai lầm và không cần phải nói rõ ràng là sử dụng root người dùng, vì vậy tôi đã xóa nó, nhưng không có gì thay đổi. Tôi cũng đã thử sao chép nó vào /etc/crontab, nhưng nó cũng không hoạt động. FYI khác, các lệnh cron đơn giản hơn hoạt động tốt - echo 'lol' > test.outchẳng hạn.
Jeremy Swinarton

Đó là cách nó được viết. Ngày là một lệnh và chuỗi là một tùy chọn. Hãy thử nhập nó trong bảng điều khiển của bạn.
Jeremy Swinarton

Tôi đang sử dụng windows ngay bây giờ lol
khaled_webdev

Câu trả lời:


1

Vấn đề, như tôi đã đề cập trong bản cập nhật, là với datelệnh. Hóa ra, nếu bạn đang viết các lệnh trực tiếp vào crontabvà không chèn vào một kịch bản shell, bạn cần phải thoát khỏi %trong datechuỗi lựa chọn. Đây là những gì đã kết thúc làm việc:

0 * * * * rsync -av --delete user@host:/path/to/dir 
user@host:/path/to/another/dir /path/to/destination
--exclude='.DS_Store' >
/var/log/backup/`date '+\%Y_\%m_\%d_\%H'`h_hourlybackup.log 2>&1

Cảm ơn tất cả mọi người đã giúp tôi tìm ra cái này. Lệnh này có thể sẽ trở nên dài hơn và phức tạp hơn trong tương lai và do đó sẽ phù hợp hơn với kịch bản shell của chính nó, nhưng bây giờ nó ổn trực tiếp crontab, tôi nghĩ vậy.


0

Hầu hết thời gian là vì bạn đã không đặt một con đường đầy đủ cho rsync thích của bạn

/usr/bin/rsync -av ...

Ngoài ra, bạn có thể cố gắng tạo một tập lệnh shell nhỏ và đặt lệnh đó ở đó và chỉ thực hiện tập lệnh duy nhất đó từ cron của bạn


Hừm. Đã thử cả hai, nhưng không may, không làm việc. Tôi thay thế rsyncvới /usr/bin/rsyncvà ném nó tất cả trong một kịch bản shell. Chạy tập lệnh từ dòng lệnh hoạt động, nhưng nó vẫn không đi vào crontab. Đi hình.
Jeremy Swinarton

0

Nó có thể là một vấn đề đường dẫn, nhưng không có khả năng vì root nên có /usr/bintrong đường dẫn của nó.

Tuy nhiên, các lệnh crontab có lẽ hầu hết không chạy với Bash, mà là Dash . Cấu &>trúc là một "Bashism" [ 1 ] [ 2 ].

Thay thế

command >& file

với

command > file 2>&1

để làm cho nó hoạt động như dự định trong Dash.


0

đặt lệnh rsync của bạn vào tập lệnh .sh (shell) để khởi chạy nó với crontab

  • tìm kiếm về shell script như mẫu này

    kiểm tra

#! / thùng / sh

echo $2 echo $1
  • trong tập lệnh của bạn sử dụng cú pháp này để đặt tên cho tệp sao lưu của bạn

ngay bây giờ = $ (ngày + "% m_% d_% Y")

.. &> /var/log/backup/{$now}_hourlybackup.log

0

Sẽ chỉ đơn giản là nhận xét để trả lời kiểm tra nhưng mới và chưa thể bình luận.

Tôi chỉ muốn giải thích lý do tại sao bạn nhìn thấy vấn đề này. % biểu thị một dòng mới và bất kỳ văn bản nào sau khi văn bản đầu tiên được cung cấp cho lệnh dưới dạng stdin.

Vì vậy, lệnh cron của bạn:

rsync -av --delete -e "ssh -i /root/.ssh/id_rsa" user@host:/path/to/dir/ \
  user@host:/path/to/another/dir/ /destination/dir --exclude='.DS_Store' \
  &> /var/log/backup/`date '+%Y_%m_%d_%H:%M'`_hourlybackup.log

được hiểu là:

rsync -av --delete -e "ssh -i /root/.ssh/id_rsa" user@host:/path/to/dir/ \
  user@host:/path/to/another/dir/ /destination/dir --exclude='.DS_Store' \
  &> /var/log/backup/`date '+<<EOI
Y_
m_
d_
H:
M'`_hourlybackup.log
EOI

Khi shell cố gắng thực thi nó, nó không thể tìm thấy `thứ hai vì nó hiện đang là một phần của stdin của lệnh. Điều quan trọng là nhận ra tất cả% ký tự cần được thoát trừ khi bạn thực sự muốn dòng mới.

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.