명명된 파이프에 대한 eek() 작업이 성공적으로 반환될 수 있습니까?

명명된 파이프에 대한 eek() 작업이 성공적으로 반환될 수 있습니까?

seek()프로그램 이 명명된 파이프에서 작업을 수행하려고 할 때 "불법 탐색" 대신 성공적으로 반환되도록 하는 방법이 있습니까 (그러나 파이프가 빈 파일인 것처럼)?

내 시스템의 모든 로깅은 SQLite 데이터베이스에 저장되며 어디에도 파일이 없습니다. 그러나 이 문제를 해결하는 일부 프로그램이 있습니다. 구체적으로 2가지 상황이 있습니다.

  • 프로그램은 syslog-ng가 명명된 파이프로 생성하고 읽고 있는 로그 파일에 기록하려고 합니다. 프로그램이 어떤 이유로 실행하려고 했으나 seek()실패했습니다.
  • 프로그램(예:denyhosts 또는fail2ban)은 syslog-ng가 명명된 파이프로 생성되어 기록 중인 로그 파일을 읽으려고 합니다. 프로그램이 seek()해당 작업을 수행하려고 했으나 실패했습니다.

이상적으로는 명명된 파이프가 빈 파일인 것처럼 검색이 작동하도록 하고 싶습니다. 로그를 작성하는 프로그램이 탐색을 수행해야 하는 이유를 알 수 없습니다. 추가를 위해 파일을 열고 쓰기를 시작하면 됩니다. 나는 프로그램 읽기가 마지막 위치에서 재개될 수 있도록 탐색을 원하는 이유를 이해할 수 있으므로 파일이 비어 있는 것처럼(잘린 것처럼) 동작하기를 원합니다.

그렇다면 명명된 파이프가 이런 식으로 동작하도록 몇 가지 옵션을 설정할 수 있습니까? 그렇지 않은 경우 파이프가 열릴 때 syslog-ng가 이런 방식으로 작동하도록 모드를 설정할 수 있습니까(코드를 기꺼이 변경하겠습니다)? 아니면 내가 개울에 있는 걸까?

답변1

Linux 커널에 대해 찾기 가능한 파이프가 제안되었지만 이를 구현하는 데 사용할 수 있는 패치는 없습니다.

당신이 사용할 수있는LD_PRELOAD'ed 라이브러리는 lseek특정 파일에 대한 호출을 무시합니다. 나는 이 목적으로 사용할 수 있는 기성 포장지를 알지 못합니다.섀도우 파일 시스템하나 작성하는 것이 도움이 될 수 있습니다.

답변2

응용 프로그램이 검색을 호출하는 경우 응용 프로그램이 손상되었거나 파이프와 작동하지 않는 것입니다. 전자라면 수정이 필요합니다. 후자라면 검색이 실제로 작동할 것으로 기대하므로, 작동하지 않을 때 거짓말을 하고 작동한다고 주장하면 잘못된 작업이 발생할 것이 거의 확실합니다.

또한 로그 파일이 명명된 파이프로 바뀌면 한 번에 하나의 프로세스만 읽을 수 있습니다. 소켓이어야 합니다.

관련 정보