2008-10-01 34 views
8

cài đặt Cron là vixie-cronbash script chạy từ vỏ nhưng không phải từ công việc định kỳ

/etc/cron.daily/rmspam.cron

#!/bin/bash 
/usr/bin/rm /home/user/Maildir/.SPAM/cur/*; 

I Have kịch bản này bash đơn giản mà tôi muốn thêm vào một công việc định kỳ (cũng bao gồm thư rác học tập lệnh trước) nhưng phần này luôn thất bại với "File hoặc thư mục không tìm thấy" Từ những gì tôi con số là metachar không được interperted một cách chính xác khi chạy như một công việc cron. Nếu tôi thực thi kịch bản từ dòng lệnh thì nó hoạt động tốt.

Tôi muốn một lý do tại sao cho điều này không làm việc và tất nhiên là một giải pháp làm việc :)

Cảm ơn

chỉnh sửa # 1 trở lại câu hỏi này khi tôi nhận huy hiệu câu hỏi phổ biến cho nó. đầu tiên tôi đã làm điều này,

#!/bin/bash 
find /home/user/Maildir/.SPAM/cur/ -t file | xargs rm 

và chỉ gần đây đã được đọc qua trang xargs con người và thay đổi nó để

#!/bin/bash 
find /home/user/Maildir/.SPAM/cur/ -t file | xargs --no-run-if-empty rm 

tùy chọn xargs ngắn này là -r

+0

Vui lòng chỉnh sửa và thêm dòng từ crontab của bạn. –

+0

Ông đã đề cập trong một bình luận dưới đây rằng nó nằm trong /etc/cron.daily –

Trả lời

14

Nếu không có tệp nào trong thư mục, khi đó ký tự đại diện sẽ không được mở rộng và sẽ được chuyển trực tiếp đến lệnh. Không có tập tin được gọi là "*", và sau đó lệnh không thành công với "Tập tin hoặc thư mục không tìm thấy." Hãy thử thay vào đó:

if [ -f /home/user/Maildir/.SPAM/cur/* ]; then 
    rm /home/user/Maildir/.SPAM/cur/* 
fi 

Hoặc chỉ sử dụng cờ "-f" để rm. Vấn đề khác với lệnh này là những gì xảy ra khi có quá nhiều thư rác cho độ dài tối đa của dòng lệnh. Một cái gì đó như thế này có lẽ là tốt hơn tổng thể:

find /home/user/Maildir/.SPAM/cur -type f -exec rm '{}' + 

Nếu bạn có một tuổi thấy rằng chỉ giám đốc điều hành rm một tập tin tại một thời điểm:

find /home/user/Maildir/.SPAM/cur -type f | xargs rm 

Đó xử lý quá nhiều tập tin cũng như không có tập tin. Cảm ơn Charles Duffy đã chỉ ra tùy chọn + để tìm kiếm.

+0

Thực ra, bạn không cần xargs với một tìm kiếm đủ mới: find /home/user/Maildir/.SPAM/cur -type f -exec rm - f '{}' '+' –

+0

không nên tìm kết thúc bằng \; ? – hop

+0

Xóa tệp là tác vụ thường xuyên đến mức 'tìm' cũng hỗ trợ thao tác' -delete'. Không cần phải làm rõ '-exec rm '{}''. – ulidtko

0

Bạn đang xác định đường dẫn đầy đủ cho kịch bản trong cronjob?

00 3 * * * /home/me/myscript.sh 

hơn

00 3 * * * myscript.sh 

Ngày lưu ý khác, đó là /bin/rm trên tất cả các hộp linux Tôi có quyền truy cập vào. Bạn đã kiểm tra kỹ xem nó có thực sự là /usr/bin/rm trên máy của bạn không?

+0

tập lệnh nằm trong /etc/cron.daily/ được giải quyết trong/etc/crontab – Tanj

+0

Hmmm. Điều đó rất kỳ quặc. –

+0

Đó là cách mặc định mà vixie-cron được thiết lập trên bản phân phối gentoo. ya là/bin/rm mặc dù có liên kết đến/usr/bin/rm. Có lẽ lần sau tôi sẽ sử dụng rm để tìm đường đi thay vì đoán – Tanj

0

thử thêm

[email protected] 

để phía trên cùng của tập tin cron của bạn và bạn sẽ nhận được bất kỳ đầu vào/lỗi gởi đến quý vị.

Cũng xem xét thêm các lệnh như một cronjob

0 30 * * * /usr/bin/rm /home/user/Maildir/.SPAM/cur/* 
0

Hãy thử sử dụng một lựa chọn lực và quên đi thêm một đường dẫn đến lệnh rm. Tôi nghĩ rằng điều đó không cần thiết ...

rm -f 

Điều này sẽ đảm bảo rằng ngay cả khi không có tệp nào trong thư mục, lệnh rm sẽ không thất bại. Nếu đây là một phần của một kịch bản lệnh shell, thì * sẽ hoạt động. Dường như với tôi rằng bạn có thể có một thư mục trống ...

Tôi hiểu rằng phần còn lại của tập lệnh đang được thực thi, phải không?

0

Is rm thực sự nằm ở /usr/bin/ trên hệ thống của bạn? Tôi đã luôn luôn nghĩ rằng rm phải nằm trong /bin/.

Các vấn đề liên quan