프로그램 seek()
이 명명 된 파이프에서 작업 을 수행하려고 할 때 ‘Illegal seek’대신 성공 (파이프가 빈 파일 인 것처럼 작동 함) 할 수 있도록하는 방법이 있습니까?
SQLite 데이터베이스에 저장된 시스템에 모든 마지막 로깅이 있으며 파일이 없습니다. 그러나 이것에 문제가있는 몇 가지 프로그램이 있습니다. 두 가지 구체적인 경우가 있습니다.
- 프로그램이 syslog-ng가 명명 된 파이프로 작성하여 읽고있는 로그 파일에 쓰려고합니다. 프로그램이
seek()
어떤 이유로 인해 수행하려고하지만 실패합니다. - 프로그램 (예 : denyhosts 또는 fail2ban)은 syslog-ng가 명명 된 파이프로 작성하여 쓰고있는 로그 파일에서 읽으려고합니다. 프로그램이 수행하려고
seek()
하지만 실패합니다.
이상적으로는 명명 된 파이프가 단지 빈 파일 인 것처럼 행동하려고합니다. 로그를 작성하는 프로그램이 어쨌든 탐색을 수행 해야하는 이유를 알 수 없으므로 추가하기 위해 파일을 열고 쓰기를 시작해야합니다. 프로그램 읽기가 왜 원하는지 알 수 있으므로 마지막 위치에서 다시 시작할 수 있으므로 파일이 비어있는 것처럼 (파일이 잘린 것처럼) 동작하고 싶습니다.
명명 된 파이프에서 이러한 방식으로 동작하도록 설정할 수있는 옵션이 있습니까? 그렇지 않으면 syslog-ng가 파이프를 열어 이런 식으로 작동하도록 설정할 수있는 모드가 없습니다 (코드 변경이 가능합니다)? 아니면 내가 개울입니까?
답변
리눅스 커널을 위해 구할 수있는 파이프가 제안되었지만,이를 구현하기위한 패치가 작동하지 않습니다.
특정 파일에 LD_PRELOAD
대한 lseek
호출 을 재정의 하는 ‘ed 라이브러리를 사용할 수 있습니다 . 이 목적을 위해 기성품 래퍼를 모르겠습니다. Shadowfs 는 하나를 작성하는 데 도움이 될 수 있습니다.
답변
응용 프로그램이 seek를 호출하는 경우 응용 프로그램이 손상되었거나 파이프에서 작동하지 않습니다. 전자의 경우 수정해야합니다. 후자가 실제로는 탐색이 실제로 작동하기를 기대하므로 거짓말을하고 주장했을 때 그것이 거의 확실하게 부정확 한 작동을 일으킬 것이라고 주장했다.
또한 로그 파일이 명명 된 파이프로 바뀌면 한 번에 하나의 프로세스 만 읽을 수 있습니다. 대신 소켓이어야합니다.