Đường ống đầu ra wget đến / dev / null trong cron


38

Tôi đang chạy lệnh sau cứ sau 5 phút trong crontab của mình để giữ Phusion Pasbah còn sống.

*/5 * * * * wget mysite.com > /dev/null 2>&1

Khi tôi chạy nó, nó thực hiện một wget trên các tuyến url của trang STDOUT / STDERR tới / dev / null. Khi tôi chạy nó từ một dòng lệnh, nó hoạt động tốt và không tạo ra tệp index.html trong thư mục chính của tôi.

Khi nó chạy từ cron, nó sẽ tạo một tệp index.html mới cứ sau năm phút, để lại cho tôi rất nhiều tệp chỉ mục mà tôi không muốn.

Là cú pháp của tôi không chính xác để chạy công việc cron? Từ một dòng lệnh, nó hoạt động mà không gặp vấn đề gì, nhưng từ cron, nó tạo ra một tệp index.html trong thư mục chính của tôi.

Tôi chắc chắn rằng tôi đang mắc một lỗi đơn giản, sẽ đánh giá cao nếu có ai có thể giúp đỡ.


1
Một câu hỏi khác là tại sao điều này không tạo ra một tệp khi bạn chạy nó từ dòng lệnh bằng tay. Theo như tôi có thể nói từ tài liệu, sự khác biệt duy nhất giữa việc chạy wgettừ thiết bị đầu cuối và mặt khác là liệu thanh tiến trình có được hiển thị hay không.
Barmar

Câu trả lời:


61

Bạn có thể làm như thế này:

*/5 * * * * wget -O /dev/null -o /dev/null example.com

Ở đây -Osẽ gửi tệp đã tải xuống /dev/null-oghi nhật ký /dev/nullthay vì stderr. Cách đó không cần thiết phải chuyển hướng.


1
Cảm ơn, điều này trực tiếp hơn là chuyển hướng đến STDERR / STDOUT. Tôi đánh giá cao nó.
nulltek

17

Bạn có cần phải thực sự tải xuống nội dung hay chỉ cần nhận 200 OK? Nếu bạn chỉ phải yêu cầu máy chủ xử lý yêu cầu, tại sao không sử dụng --spiderđối số?


Đó là một suy nghĩ tốt. Tôi thực sự chỉ cần phản hồi 200 OK.
nulltek

Tôi đã hy vọng ai đó không thiên vị sẽ chỉ ra điều đó, nhưng ... cuối cùng bạn đã sử dụng giải pháp nào? Câu trả lời của tôi thực sự là cách chính xác để làm điều này :)
Nacht - Tái lập lại

10

Tôi sẽ sử dụng như sau:

/5 * * * * wget -O - mysite.com > /dev/null 2>&1

Các -O -tùy chọn đảm bảo rằng các nội dung tải xuống là gửi đến stdout.


4
Lưu ý rằng foo > /dev/null 2>&1được viết chính xác hơn như foo &> /dev/null.
amalloy

3
@amalloy Chỉ trong bash. Trong sh, thường là những gì cron sử dụng, chuyển hướng ampersand không hoạt động.
Soviero

5

Bạn nói rằng bạn chỉ cần phản hồi "200 OK" trong một bình luận.

Điều đó cho phép giải pháp với một số lợi thế bổ sung so với những lợi ích của
wget -O /dev/null -o /dev/null example.com. Ý tưởng là không loại bỏ đầu ra theo một cách nào đó, nhưng không tạo ra bất kỳ đầu ra nào cả.

Rằng bạn chỉ cần phản hồi nghĩa là dữ liệu được tải xuống tệp cục bộ index.html không cần phải tải xuống ở vị trí đầu tiên.
Trong giao thức HTTP, lệnh 'GET' được sử dụng để tải xuống tài liệu . Để truy cập tài liệu theo cách thực hiện mọi thứ trừ khi thực sự tải xuống tài liệu, có một lệnh đặc biệt 'ĐẦU'.
Khi sử dụng 'GET' cho tác vụ này, tài liệu được tải xuống và loại bỏ cục bộ. Sử dụng 'ĐẦU' thực hiện đúng những gì bạn cần, nó không chuyển tài liệu ở vị trí đầu tiên. Theo định nghĩa, nó sẽ trả về mã kết quả giống như 'GET', theo định nghĩa.

Cú pháp sử dụng phương pháp này HEADvới wgetlà một chút kỳ lạ: chúng ta cần phải sử dụng tùy chọn --spider. Trong ngữ cảnh này, nó chỉ thực hiện những gì chúng ta muốn - truy cập URL bằng 'ĐẦU' thay vì 'NHẬN'.
Chúng ta có thể sử dụng tùy chọn -q(yên lặng) để wgetkhông xuất chi tiết về những gì nó làm.

Kết hợp điều đó, wgetsẽ không xuất bất cứ thứ gì vào thiết bị lỗi chuẩn, cũng không lưu tài liệu.

wget -q --spider 'http://example.com/'

Mã thoát cho chúng tôi biết yêu cầu có thành công hay không:

$ wget -q --spider 'http://example.com/'
$ echo $?
0
$ wget -q --spider 'http://example.com/nonexisting'
$ echo $?                                          
8

Đối với một lệnh trong crontab, thực tế là không có đầu ra trong cả hai trường hợp có nghĩa là bạn có thể sử dụng không nhận đầu ra như một dấu hiệu của lỗi một lần nữa.

Lệnh ví dụ của bạn sẽ được thay đổi thành:

*/5 * * * * wget -q --spider mysite.com

Điều này có những lợi thế tương tự như wget -O /dev/null -o /dev/null example.com. Ưu điểm bổ sung là đầu ra nhật ký và đầu ra tài liệu không được tạo ra, thay vì được tạo và loại bỏ cục bộ. Hoặc tất nhiên sự khác biệt lớn là tránh tải xuống và sau đó loại bỏ tài liệu index.html,.


Tôi thích cách tiếp cận này là tốt. Tôi đánh giá cao phản hồi và câu trả lời của bạn.
nulltek

3

để giữ Phusion Hành khách còn sống.

Có thể câu hỏi của bạn là về điều này, trang web nói:

Một máy chủ web và máy chủ ứng dụng nhanh và mạnh mẽ cho

Điều này không cần bất kỳ kịch bản giữ gìn.

Nếu không, giải pháp của kasperd là hoàn hảo.


Cảm ơn phản hồi, mặc dù nó không mang tính xây dựng. Các máy chủ ứng dụng không thành công - mặc dù đó thường không phải là lỗi của bộ chứa.
Felix Frank

1
Tôi đồng ý rằng nó không cần bất kỳ cronjobs nào để giữ cho nó sống. Nhưng đó là một sửa chữa nhanh chóng trong khi tôi nghiên cứu điều chỉnh Nginx / Hành khách. Đã thực sự chỉ tìm cách tốt nhất để xuất thành / dev / null. Tôi đã có hành khách bị lỗi hoặc treo trong 2 phút tại một thời điểm khi không tải, vì vậy việc yêu cầu url giữ cho hành khách bị cháy ngay bây giờ.
nulltek

1
Sẽ là tốt để hiểu, những gì đang được giữ bởi các wgetlệnh. Trong nhiều tình huống, nhu cầu giữ thông điệp sống là một triệu chứng của lỗ hổng thiết kế cơ bản cần được khắc phục. Nhưng ngay cả khi tất cả những cái đó đã được sửa, vẫn sẽ có một vài trường hợp còn lại trong đó một thông điệp giữ sống là giải pháp phù hợp. Ngay cả khi không cần giữ các thông điệp sống động, công việc định kỳ vẫn có thể là một phần hữu ích của thiết lập giám sát.
kasperd

Điều này sẽ tốt hơn như là một nhận xét hơn là một câu trả lời.
moopet
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.