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


10

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

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

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

이 명령이 트릭을 수행 할 것으로 기대하지만 foo.sh이미 완료 되면 파일을 계속 읽 습니다.

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

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

답변:


12

백그라운드 프로세스를 백그라운드로 보내면 훨씬 간단합니다.

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

$!캡처 마지막 작업의 PID는 우리가 할 수 있도록, 백그라운드에서 실행 보낸 wait후 마무리 스크립트에, 그리고 우리가 더 이상 필요하지 않을 때 과정을.killtail


3
멋진 답변, 오늘 새로운 것을 배웠습니다
Miguel Mota

7

이 버전도 그렇게 할 수 있습니다.

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

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


개인적으로, 나는 작업 명부를 사용하는 대신 명시 적 PID를 캡처하는 것을 선호합니다. 점점 복잡 해지는 구현은 백그라운드에서 둘 이상의 작업을 수행 kill %1하고 잘못된 목표를 얻을 수 있기 때문에.
DopeGhoti

1
하위 쉘 괄호를 사용했기 때문에 % 1은 하위 쉘 내부의 첫 번째 작업을 참조합니다 (그러나 모든 쉘에 대해 확실하지는 않습니다). 분명히 귀하의 솔루션은 더 완벽하고 기능적인 경우가 많지만 사용자가 필요로하는 일을 할 수 있다고 생각합니다 .... 또 다른 문제는 내 버전에는 터치로 foo_part.log를 만들어야하지만 버전이 그렇지 않다는 것입니다.
Luciano Andress Martini
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.