Có thể thực hiện các hoạt động tìm kiếm () trên đường ống có tên thành công không?


12

Có cách nào để làm cho nó để khi các chương trình cố gắng thực hiện các seek()thao tác trên một đường ống có tên, nó sẽ trở lại thành công (nhưng hành động như thể đường ống là một tập tin trống) thay vì 'Tìm kiếm bất hợp pháp'?

Tôi có một chút đăng nhập cuối cùng trên hệ thống của mình được lưu trữ trong cơ sở dữ liệu SQLite, tôi không có tệp ở bất cứ đâu. Tuy nhiên, có một vài chương trình gặp rắc rối với điều này. Có 2 trường hợp cụ thể;

  • Một chương trình muốn ghi vào một tệp nhật ký mà syslog-ng đã tạo như một ống có tên và đang đọc từ đó. Chương trình muốn thực hiện một seek()số lý do và sau đó thất bại.
  • Một chương trình (chẳng hạn như denyhosts hoặc fail2ban) muốn đọc từ tệp nhật ký mà syslog-ng đã tạo như một ống có tên và đang ghi vào. Chương trình muốn thực hiện một seek()trên nó và thất bại.

Lý tưởng nhất là tôi muốn những người này tìm cách hành xử như thể cái ống được đặt tên chỉ là một tập tin trống. Tôi không thể thấy bất kỳ lý do tại sao một chương trình viết nhật ký sẽ cần phải thực hiện tìm kiếm bằng mọi cách, nó chỉ nên mở tệp để chắp thêm và bắt đầu viết. Tôi có thể thấy lý do tại sao một chương trình đọc muốn tìm kiếm, để nó có thể tiếp tục từ vị trí cuối cùng của nó, và vì vậy tôi muốn nó hoạt động như thể tập tin trống (giống như nó đã bị cắt ngắn).

Vì vậy, có một số tùy chọn có thể được đặt trên các đường ống được đặt tên để khiến chúng hành xử theo cách này? Nếu không có chế độ có thể được đặt khi syslog-ng mở đường ống để nó hoạt động theo cách này (Tôi đang mở để thực hiện thay đổi mã)? Hay tôi lên một con lạch?

Câu trả lời:


10

Các ống có thể tìm kiếm đã được đề xuất cho nhân Linux, nhưng tôi không biết về một bản vá hoạt động để thực hiện chúng.

Bạn có thể sử dụng LD_PRELOADthư viện 'ed ghi đè lseekcuộc gọi trên các tệp cụ thể. Tôi không biết về bất kỳ gói bọc ngoài nào cho mục đích này. Shadowfs có thể giúp viết một.


1
Tôi sẽ thử tuyến LD_PRELOAD. Không phải là giải pháp lớn nhất, nhưng nên làm được.
Patrick

Btw, việc có đường ống có thể tìm kiếm là cần thiết cho ít hơn để có thể theo đường ống giống như cách nó có thể theo tập tin? Tôi đang hỏi trong bối cảnh Theo dõi một đường ống sử dụng ít hơn? câu hỏi (bạn có thể thích trả lời ở đó).
Piotr Dobrogost

@PiotrDobrogost Trong ngữ cảnh của Flệnh ít hơn, sẽ ít hơn để làm mới màn hình nếu nó không nhận được bất kỳ đầu ra nào trong một giây. Làm cho các đường ống có thể tìm kiếm sẽ không giúp ích gì: sự khác biệt có liên quan ở Fphần cuối của tệp, sau đó chờ dữ liệu xuất hiện ở cuối - nhưng đối với một đường ống, phần cuối của tệp chỉ xuất hiện khi người viết đóng tệp.
Gilles 'SO- ngừng trở nên xấu xa'

1

Nếu ứng dụng đang gọi tìm kiếm, thì nó bị hỏng hoặc không hoạt động trên đường ống. Nếu trước đây, thì nó cần cố định. Nếu sau này, nó mong đợi việc tìm kiếm thực sự hoạt động, vì vậy nói dối và tuyên bố nó hoạt động khi nó gần như không chắc chắn sẽ gây ra hoạt động không chính xác.

Ngoài ra, nếu tệp nhật ký được thay thế bằng một ống có tên, thì mỗi lần chỉ có thể đọc một quy trình. Nó nên là một ổ cắm thay thế.


2
Không có nghĩa là làm việc trên đường ống không có nghĩa là không thể làm việc trên đường ống. Điều gì sẽ xảy ra nếu ứng dụng chỉ đơn giản là thực hiện TÌM KIẾM để đến cuối tệp? Hoặc có thể nó đang thực hiện một XEMK_CUR để tìm vị trí hiện tại. Cả hai điều này sẽ không gây ra bất kỳ vấn đề gì nếu tôi nói dối với chương trình về kết quả tìm kiếm. Nơi duy nhất sẽ bị hỏng là nếu ứng dụng đang cố quay lại và ghi đè lên dữ liệu đã được ghi mà nó không nên làm với các tệp nhật ký. Và vâng, tôi nhận thức được giới hạn một quy trình trên mỗi ống. Đây không phải là một vấn đề.
Patrick

1
Nếu tất cả những gì nó làm là tìm đến cuối để chắp thêm, thì nó chỉ nên mở tệp ở chế độ chắp thêm, để nó rơi vào danh mục bị hỏng. Các ứng dụng không cố gắng tìm vị trí hiện tại trừ khi chúng cần có thể tìm kiếm ở một nơi khác và sau đó quay lại vị trí hiện tại, vì vậy nó sẽ rơi vào danh mục "bạn sẽ phá vỡ nó bằng cách âm thầm thất bại". Rất khó có khả năng một chương trình gọi tìm kiếm nhưng không thực sự cần nó để hoạt động (và nếu có, nó nằm trong danh mục bị hỏng).
psusi

1
Không đúng. Nhiều ứng dụng tìm đến cuối tệp trong trường hợp một số chương trình khác đã ghi vào tệp kể từ lần cuối. Mặt khác, viết ở đâu hiện tại sẽ ghi đè các thay đổi của chương trình khác. Và nếu nó đọc từ tệp, nó có thể muốn sử dụng XEMK_CUR để lấy vị trí hiện tại của nó để khi chương trình khởi động lại, nó có thể tiếp tục ở nơi nó dừng lại.
Patrick

1
@Patrick, trước đây, nếu nó đang nối thêm thì nên mở lại tệp ở chế độ chắp thêm. Trong trường hợp này, bạn đang nói về việc đọc, trong trường hợp đó, sẽ không có ý nghĩa gì khi bỏ qua dữ liệu mới mà nó chưa đọc (và âm thầm bỏ qua việc tìm kiếm sẽ phá vỡ điều đó). Về phần sau, nếu nó đang cố sử dụng tìm cách quay lại vị trí tương tự sau khi đóng và mở lại tệp sẽ bị vỡ trên đường ống nếu bạn âm thầm bỏ qua tìm kiếm, vì khi đóng đường ống, máy chủ sẽ nhận được SIGPIPE, có lẽ làm cho nó được thiết lập lại để khách hàng tiếp theo mở đường ống bắt đầu từ đầu.
psusi
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.