tìm -delete hoạt động tốt, nhưng không phải với cron


10

XIN LƯU Ý : Tôi đã đọc tất cả các câu hỏi tương tự. cron, đường dẫn, biến env, v.v., nhưng không tìm thấy giải pháp nào cho vấn đề cụ thể của tôi.


Tôi có một kịch bản làm cho một số MySQL bị loại bỏ và sau đó xóa những cái cũ như thế này:

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete

( lệnh trên đã được sửa đổi từ lệnh ban đầu của tôi bằng các đề xuất từ ​​ý kiến )

Tuy nhiên, các tệp không bao giờ bị xóa khi cron chạy tập lệnh này. Người dùng cron là root.

Ghi chú gỡ lỗi

  • Nếu tôi tự chạy tập lệnh trong đó lệnh xuất hiện, nó sẽ xóa chúng như mong đợi.

  • Nếu tôi tự chạy lệnh find ở trên từ dòng lệnh dưới dạng root, nó sẽ xóa chúng như mong đợi (và với -print nó sẽ trả về một danh sách các tệp cũ hơn 5 ngày như mong đợi)

  • Tôi cũng đã thêm một tuyên bố đường dẫn rõ ràng vào crontab của root, nhưng
    điều đó không thay đổi bất cứ điều gì.

  • Cron gửi không có lỗi và nếu tôi chuyển hoạt động tìm đến tệp nhật ký,
    nó sẽ trống hoặc hoàn toàn không được tạo.

  • Tôi đang sử dụng máy chủ Ubuntu 14.04.03 LTS.


Tôi sẽ tránh mở rộng ký tự đại diện (ví dụ * .gz) trong đường dẫn. cron có thể hiểu là * .gz, không mở rộng tất cả các tệp gz.
Archemar

Bạn sẽ nhận được kết quả đầu ra nào nếu bạn thực hiện công việc mà không có hành động/usr/bin/find /home/bkp/dbdump/*.gz -mtime +5
user9517

@Archemar Tại sao ký tự đại diện không được mở rộng? croncác lệnh được chạy qua shell và shell mở rộng các ký tự đại diện.
Barmar

cronnên gửi email với thông báo đầu ra và lỗi. Bạn có nhận được email nào từ công việc này không?
Barmar

@Tôi làm việc như mong đợi.
TommyPeanuts

Câu trả lời:


6

Vấn đề là crontabnó không được $PATHthiết lập khi nó chạy. Bạn thực sự có thể cung cấp cho nó một đường dẫn bằng cách thêm phần này vào đầu tệp được mở thông qua crontab -e:

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

(hoặc bất cứ điều gì PATHbạn muốn sử dụng). Điều này có nghĩa là bạn có thể tránh chỉ định các đường dẫn đầy đủ đến các lệnh, trực tiếp từ cron.

Có nhiều vấn đề với lệnh ban đầu của bạn. Về cơ bản, bạn đang yêu cầu shell thực hiện việc mở rộng ký tự đại diện find. Thứ hai, bạn không cung cấp một đường dẫn đầy đủ cho rm; sử dụng /bin/rmhoặc /usr/bin/rm, bất cứ nơi nào nó nằm trên hệ thống của bạn (xem which rm).

Đối số đầu tiên để tìm là "vị trí cần tìm" và sau đó bạn chỉ định "truy vấn tìm kiếm" với các -<option>s khác nhau . Vì vậy, định dạng đúng của lệnh bạn muốn chạy là:

find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec rm -f {} \;

hoặc là

find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete

Nếu bạn không chỉ định định PATHnghĩa như trên, hãy sử dụng:

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec /bin/rm -f {} \;

hoặc là

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete

1
Nó nên được $PATHđặt, nhưng nó sẽ là mặc định của hệ thống. Điều này sẽ bao gồm /usr/bin/bin, vì vậy nó sẽ có thể tìm thấy rmlệnh.
Barmar

Vì vậy, tôi đã thử đặt $ PATH vào crontab (mặc dù như đã đề cập ở nơi khác, nó có thể sẽ mặc định theo đường dẫn hệ thống nếu không được nêu) và đảm bảo mọi thứ đều có đường dẫn đầy đủ. Tôi cũng đã sử dụng -name "* .gz" thay vì ký tự đại diện trên đường dẫn tìm. Nhưng không có gì xảy ra. Lệnh dường như không chạy và không có lỗi nào được đưa ra.
TommyPeanuts

3

Hãy thử điều này thay thế

find /home/bkp/dbdump -type f -name '*.gz' -mtime +5 -delete

Tại sao bạn sẽ chuyển hướng stderr đến một tập tin? Theo mặc định, nó sẽ được gửi qua email nếu có bất kỳ đầu ra nào.
kasperd

Đúng, theo mặc định, việc gửi bất kỳ email nào đến bộ đệm MAIL của người dùng và có thể được đọc bằng thư.
shad0VV

1
Để có được hiệu ứng tương tự như lệnh ban đầu, bạn sẽ cần thêm -maxdepth 1.
Niels Keurentjes

0

Nếu tôi gọi lệnh find trực tiếp từ crontab của root và không phải là một phần của tập lệnh, thì nó hoạt động.

Kịch bản trong câu hỏi sử dụng csh. Tôi tin rằng môi trường cron gốc trên Ubuntu sẽ sử dụng / bin / bash (hoặc / bin / dash?). Có lẽ điều này mâu thuẫn theo cách nào đó với cách lệnh find đang chạy.

Dù bằng cách nào, vấn đề chính mà nó đã giải quyết, mặc dù có phần không liên tục.

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.