2013-02-27 28 views
5

Tôi có một câu hỏi và tôi không thể tìm thấy trợ giúp ở bất cứ nơi nào trên stackoverflow hoặc web.Đăng nhập vào một đường ống có tên không bị chặn?

Tôi có một chương trình (hàng đợi nhiệm vụ phân phối cần tây) và tôi có nhiều trường hợp (công nhân) mỗi người có một logfile (celery_worker1.log, celery_worker2.log).

Các lỗi quan trọng được lưu trữ vào cơ sở dữ liệu, nhưng thỉnh thoảng tôi thích các nhật ký này khi chạy các thao tác mới để đảm bảo mọi thứ đều ổn (giá trị thấp hơn).

Vấn đề của tôi: các nhật ký này đang chiếm nhiều dung lượng đĩa. Những gì tôi muốn làm: có thể "xem" các bản ghi (tail -f) chỉ khi tôi cần nó, mà không có họ chiếm rất nhiều không gian.

ý tưởng của tôi cho đến bây giờ: các bản ghi

  • outputing stdout, không vào một tập tin: không thể thực hiện ở đây kể từ khi tôi có nhiều công nhân outputing các tập tin khác nhau, nhưng tôi muốn đuôi chúng cùng một lúc (đuôi - f celery_worker * .log)
  • sử dụng logrotate: đó là giải pháp "OK" cho tôi. Tôi không muốn điều này là một nhiệm vụ hàng ngày nhưng không muốn đặt một phút crontab cho điều này, và nhiều hơn nữa, máy chủ không phải là của tôi để có nghĩa là một số công việc ở phía bên quản trị
  • sử dụng các đường ống được đặt tên: nhìn tốt ở cái nhìn đầu tiên nhưng tôi không biết rằng tên ống (linux FIFO), nơi chặn. Do đó, khi tôi không tail -f TẤT CẢ các đường ống cùng một lúc, hoặc khi tôi chỉ cần bỏ đuôi của tôi, các hoạt động bằng văn bản từ logger bị chặn.

Có cách nào để có một ống không được đặt tên, mà sẽ chỉ ném đến stdout khi đuôi, và ném đến/dev/null khi không?

Hoặc có những khó khăn về kỹ thuật đối với loại ống như vậy không? Nếu có, chúng là gì?

Cảm ơn câu trả lời của bạn!

+0

có thể trùng lặp của [năm năm không chặn Linux (theo yêu cầu đăng nhập)] (http://stackoverflow.com/questions/7360473/linux-non-blocking-fifo-on-demand-logging) –

Trả lời

1

Yêu cầu mỗi công nhân đăng nhập để xuất dữ liệu, nhưng kết nối từng thiết bị lưu trữ với tiện ích tự động cuộn và xoay nhật ký dựa trên kích thước hoặc thời gian. multilogsvlogd là những ví dụ như vậy. Đối với những chương trình đó, bạn chỉ cần đuôi tệp nhật ký "hiện tại".

Bạn nói đúng rằng logrotate không phải là giải pháp đúng cho vấn đề bạn gặp phải.

Ống có tên sẽ không hoạt động như bạn muốn. Tốt nhất, các nhà văn của bạn có thể điền vào các đường ống của họ và sau đó loại bỏ các bản ghi tiếp theo, đó là nghịch đảo của hành vi mà bạn muốn.

+0

Cảm ơn bạn @pilcrow cho câu trả lời của bạn. Tất cả 5 công nhân được đưa ra trong nền thông qua một lệnh duy nhất và tôi không muốn có một màn hình với các tab luôn luôn mở, vì vậy làm thế nào tôi có thể có họ đăng nhập vào stdouts khác nhau? Và bạn có xác nhận rằng "các đường ống không được đặt tên chuyển hướng đến/dev/null khi không đọc" không tồn tại như vậy không? Cảm ơn –

+0

@noe, về việc chia sẻ hoặc riêng biệt stdout ... điều đó phụ thuộc. Chúng tôi không biết đủ về lời kêu gọi của họ để nói. Về ngữ nghĩa ống như vậy không tồn tại, đúng. – pilcrow

1

Bạn có thể dùng thử thiết bị bộ nhớ dùng chung man:shm_overview hoặc có thể là một số trong số chúng. Bạn cần tổ chức chúng như bộ đệm tròn để lưu trữ N kb cuối cùng của nhật ký và bất cứ khi nào bạn đọc chúng bằng trình đọc, nó sẽ xuất mọi thứ vào bảng điều khiển của bạn. Cách tiếp cận này được chấp nhận bởi bộ syslog/logread của busybox (xem logread.c).

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