나는 존재하지 않는 것으로 의심되는 것을 찾고 있습니다 : 커맨드 라인에서 사용하기위한 비 차단 버퍼링 명명 된 파이프 (fifo). 그런 것이 있습니까?
유스 케이스는 다음과 같습니다. 백그라운드에서 오랜 시간 동안 실행되고에 많은 출력을 뿌릴 프로세스가 있다고 가정합니다 stdout
. 출력에 대해서는 신경 쓰지 않고 저장하고 싶지 않습니다 (아마도 충분한 공간이 없을 것입니다). 그러나 주기적으로 “들어가서”수행하고있는 작업을 수행 한 다음 다시 제거하고 싶습니다. 작업을 수행하도록 남겨 두십시오. 따라서 출력을 이론적으로 버퍼링 된 비 차단 명명 된 파이프로 리디렉션 한 다음 주기적으로 활용하고 싶습니다.
기본적으로 다음과 같이 시작하고 싶습니다 ( 10M
버퍼 크기).
mkmagicfifo magicfifo 10M
spewingprocess > magicfifo &
… 무슨 일이 벌어지고 있는지 정기적으로 살펴 봅니다.
tail -f magicfifo
… 모든 출력 (정상 파일이 아님) 을 magicfifo
저장 하지 않고 채우고 눌렀을 때 스푸핑 프로세스를 차단 하지 않고 (따라서 명명 된 파이프는 아닙니다).
나는 솔루션과 관련된 생각하지 않는다 tail
또는 prune
(내가 관련된 해결 방법을 생각할 수 있고, 잘 할 것 tail
때문에) tail
, 아직도 내가 (내가 드롭하고 그것을보고 중퇴 할 경우) 모든 데이터 어딘가에 저장하는 것이 필요 그리고 prune
모든 출력을 생성하는 프로세스의 리디렉션을 깨는 아마 (내가이 입증 / 시도하지 않은 인정한다), 파일을 다시 작성해야합니다.
나는 이것을하기 위해 유틸리티를 쓸 수있을 것으로 기대하지만 * nix는 파일과 파이프의 멋진 측면을 많이 가지고 있습니다.
그래서 : 그런 것이 있습니까? 그렇다면 그렇다면 무엇입니까?
답변
나는 당신이 찾고있는 것이 GNU라고 생각합니다 screen
. 하나 이상의 프로그램에서 마지막 화면 전체 또는 두 개 출력을 유지하기 위해 버퍼를 유지하며 연결을 끊었다가 나중에 다시 올 수 있습니다.
답변
pv
파이프 라인에서 원하는만큼 버퍼링을 제공하는를 사용할 수 있습니다 . 다음과 같이 사용할 수 있습니다.
sprewingprocess | pv -B 1g > ordinaryfifo &
그러면 spewingprocess
fifo 사이에 최대 1GB의 버퍼링이 제공 됩니다. 대부분의 Linux 배포판은 pv
패키지를 믿거 나 말거나 패키지로 제공합니다 pv
.
답변
나는 같은 문제가 있었다. 이것이 나의 첫 번째 해결책입니다. 먼저 각 줄마다 잘리는 파일에 출력을 쓰면 무한히 커지지 않습니다.
spewingprocess | while read line; do echo $line > buffer.txt ; done
그런 다음 tail을 사용하여 파일에서 읽습니다 ( 2> /dev/null
“파일이 잘린”오류 메시지가 제거됩니다).
tail -f ./buffer.txt 2> /dev/null
이런 식으로 버퍼가 커지지 않고 원하는만큼 테일을 멀티플렉싱 할 수 있습니다. 그러나이 접근 방식의 문제점은이 테스트에서 볼 수 있듯이 꼬리가 읽을 수있는 것보다 빠르게 잘라낼 때 데이터를 잃을 수 있다는 것입니다.
for ((i=0; ; i++)) ; do echo "$i" ; done | while read line; do echo $line > buffer.txt ; done
tail -f ./buffer.txt 2> /dev/null > log.txt
얼마 동안 실행 한 후 첫 줄과 마지막 줄은 다음과 같습니다.
$ head -n 1 log.txt
0
$ tail -n 1 log.txt
78783
그러나 파일의 줄 수가 적으므로 일부는 손실됩니다.
$ wc log.txt
67087 67087 392819 log.txt
데이터 손실에 대해 신경 쓰지 않거나 데이터 유출이 발생하기에 충분한 분출 과정이 빠르지 않은 경우에도 여전히 유용한 솔루션입니다.