명령을 실행하는 동안 프로세스에서 로그를 읽습니다.

명령을 실행하는 동안 프로세스에서 로그를 읽습니다.

파일에 로그를 생성하는 서비스가 있습니다 logs.log.

이 서비스와 상호 작용하는 다른 명령이 있습니다. 그것이 일부라고 가정하십시오 foo.sh.

나에게 필요한 것은 logs.log실행 중에 로그를 정확하게 잘라서 저장하는 것이다. foo.sh즉, 서비스가 나와 상호 작용할 때 서비스 로그 중 이 부분이 필요합니다 (그래서 로그 foo.sh는 신경 쓰지 않습니다 ).foo.sh

이 명령이 효과가 있기를 바랐지만 작업이 foo.sh완료된 후에도 파일을 계속 읽습니다.

> foo.sh | tail -f logs.log > foo_part.log

이 트릭을 수행하는 좋은 방법이 있습니까?

답변1

이는 백그라운드 프로세스를 백그라운드로 보내면 매우 간단해집니다.

foo.sh &
mypid=$!
tail -f /path/to/logs.log > /path/to/partial.log &
tailpid=$!
wait $mypid
kill -TERM $tailpid

$!백그라운드에서 실행되도록 전송된 마지막 작업의 PID를 캡처하여 wait스크립트에서 수행한 다음 더 이상 필요하지 않을 때 프로세스를 폐기합니다 kill.tail

답변2

이 버전도 가능합니다. (제 생각에는):

( tail -f logs.log >foo_part.log &
foo.sh&
wait $! && kill %1 ) 

%1은(는) 서브셸의 첫 번째 백그라운드 프로세스에 도달합니다.

관련 정보