명명 된 파이프에서 seek () 작업을 성공적으로 수행 할 수 있습니까?


12

프로그램 seek()이 명명 된 파이프에서 작업 을 수행하려고 할 때 'Illegal seek'대신 성공 (파이프가 빈 파일 인 것처럼 작동 함) 할 수 있도록하는 방법이 있습니까?

SQLite 데이터베이스에 저장된 시스템에 모든 마지막 로깅이 있으며 파일이 없습니다. 그러나 이것에 문제가있는 몇 가지 프로그램이 있습니다. 두 가지 구체적인 경우가 있습니다.

  • 프로그램이 syslog-ng가 명명 된 파이프로 작성하여 읽고있는 로그 파일에 쓰려고합니다. 프로그램이 seek()어떤 이유로 인해 수행하려고하지만 실패합니다.
  • 프로그램 (예 : denyhosts 또는 fail2ban)은 syslog-ng가 명명 된 파이프로 작성하여 쓰고있는 로그 파일에서 읽으려고합니다. 프로그램이 수행하려고 seek()하지만 실패합니다.

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

명명 된 파이프에서 이러한 방식으로 동작하도록 설정할 수있는 옵션이 있습니까? 그렇지 않으면 syslog-ng가 파이프를 열어 이런 식으로 작동하도록 설정할 수있는 모드가 없습니다 (코드 변경이 가능합니다)? 아니면 내가 개울입니까?

답변:


10

리눅스 커널을 위해 구할 수있는 파이프가 제안되었지만,이를 구현하기위한 패치가 작동하지 않습니다.

특정 파일에 LD_PRELOAD대한 lseek호출 을 재정의 하는 'ed 라이브러리를 사용할 수 있습니다 . 이 목적을 위해 기성품 래퍼를 모르겠습니다. Shadowfs 는 하나를 작성하는 데 도움이 될 수 있습니다.


1
LD_PRELOAD 라우트를 시도하겠습니다. 가장 좋은 해결책은 아니지만 실행 가능해야합니다.
Patrick

대한 BTW 갖는 시크 파이프가 필요하다 이하 이 파일을 따를 수 같은 방법으로 파이프를 따라 할 수 있도록? 덜 사용하여 파이프를 따르라 는 맥락에서 묻고 있습니까? 질문 (당신은 거기에 대답하는 것을 선호 할 수 있습니다).
Piotr Dobrogost 2016 년

@PiotrDobrogost F명령 의 맥락 에서, 1 초 정도 출력을 얻지 못하면 화면을 새로 고치는 데 충분하지 않습니다. 파이프를 검색 가능하게 만드는 것은 도움이되지 않습니다. F파일의 끝으로 이동 한 다음 데이터가 끝을 지나서 나타날 때까지 대기하는 파이프 라인의 차이는 있지만 파이프의 경우 파일의 끝은 라이터가 파일을 닫을 때만 나타납니다.
Gilles 'SO- 악마 그만해'

1

응용 프로그램이 seek를 호출하는 경우 응용 프로그램이 손상되었거나 파이프에서 작동하지 않습니다. 전자의 경우 수정해야합니다. 후자가 실제로는 탐색이 실제로 작동하기를 기대하므로 거짓말을하고 주장했을 때 그것이 거의 확실하게 부정확 한 작동을 일으킬 것이라고 주장했다.

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


2
파이프 작업을 의미하지 않는다고해서 파이프 작업이 불가능하다는 의미는 아닙니다. 응용 프로그램이 파일의 끝에 도달하기 위해 SEEK_END를 수행하는 경우 어떻게됩니까? 또는 현재 위치를 찾기 위해 SEEK_CUR을 수행 중일 수 있습니다. 내가 찾은 결과에 대해 프로그램에 거짓말을한다면 이들 중 어느 것도 문제를 일으키지 않을 것입니다. 응용 프로그램이 돌아가서 로그 파일로 수행해서는 안되는 이미 작성된 데이터를 덮어 쓰려고 할 경우에만 문제가 발생합니다. 그리고 네, 파이프 당 하나의 프로세스 제한을 알고 있습니다. 이것은 문제가되지 않습니다.
Patrick

1
추가하는 것이 끝까지 찾으려면 추가 모드에서 파일을 열어야하므로 깨진 카테고리에 속합니다. 응용 프로그램은 다른 곳을 찾은 다음 현재 위치로 돌아갈 수 있어야하는 경우가 아니면 현재 위치를 찾으려고 시도하지 않으므로 "자동으로 실패하여 중단됩니다"범주에 속합니다. 프로그램 호출을 시도 할 가능성은 거의 없지만 실제로 작동하는 데 필요 하지는 않습니다 (그렇다면 깨진 범주에 속함).
psusi

1
사실이 아니다. 다른 응용 프로그램이 마지막으로 파일을 작성한 이후 파일에 기록 된 경우를 대비하여 많은 응용 프로그램이 파일 끝을 찾습니다. 그렇지 않으면 현재 프로그램이 다른 프로그램의 변경 사항을 방해하는 곳에 쓰십시오. 파일에서 읽은 경우 SEEK_CUR을 사용하여 현재 위치를 가져 와서 프로그램을 다시 시작할 때 중단 된 위치에서 다시 시작할 수 있습니다.
Patrick

1
전자의 경우 @Patrick은 추가하는 경우 추가 모드에서 파일을 다시 열어야합니다. 이 경우 읽기에 대해 이야기하고 있습니다.이 경우 아직 읽지 않은 새 데이터를 건너 뛰는 것이 합리적이지 않습니다 (조용히 무시하면 검색이 중단됩니다). 후자를 사용하려는 경우, 검색을 자동으로 무시하면 파이프를 닫을 파일을 닫았다가 다시 연 후 검색을 사용하여 동일한 위치로 돌아 가려고 시도합니다. 파이프를 닫을 때 서버는 SIGPIPE를 얻으므로 아마도 파이프를 여는 다음 클라이언트가 처음에 시작되도록 재설정합니다.
psusi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.