2012-02-22 3 views
0

셸에 대해 각 stdout-line을 처리하려고 할 때 생성됩니다. test.sh (긴 과정)의 결과를 얻고 싶습니다. 꼬리 -f이 여전히 실행되고piped 프로세스를 죽이는 좋은 방법?

./test.sh >tmp.txt & 
PID=$! 
tail -f tmp.txt | while read line; do 
echo $line 
ps ${PID} > /dev/null 
if [ $? -ne 0 ]; then 
    echo "exiting.." 
fi 
done; 

그러나 불행하게도,이, 대기 한 후 "종료"인쇄합니다 : 내 현재의 접근 방식이있다. 나는 모두 시도했다 breakexit

나는 이것을 FreeBSD에서 돌린다. 그래서 나는 약간의 리눅스 꼬리의 --pid= 옵션을 사용할 수 없다.

나는 psgrep을 사용하여 꼬리의 PID를 가져 와서 죽일 수 있지만 그게 나에게는 매우 못 생깁니다.

힌트가 있습니까?

답변

2

tail 프로세스가 필요합니까? 당신은 여전히 ​​중간 tail -f를 사용하려면

./test.sh | tee tmp.txt | while read line; do 
    # process $line 
done 

: 당신이 tmp.txt의 출력을 유지하려는 경우

는 대신,

./test.sh | while read line; do 
    # process $line 
done 

의 라인을 따라 뭔가를 할 또는 수 프로세스에서 어쩌면 일반 파이프 대신 명명 된 파이프 (fifo)를 사용하여 tail 프로세스를 분리하고 해당 PID를 가져올 수 있습니다.

나는 그러나 이러한 솔루션은 경쟁 조건의 몇 가지 큰 문제를 제시 언급한다 :

  • test.sh의 PID가 다른 프로세스에 의해 재사용 될 수를;
  • 마지막 줄을 읽었을 때 test.sh 프로세스가 아직 살아 있다면 나중에 그 죽음을 감지 할 특별한 기회가 없으며 루프가 중단됩니다.
+0

첫 번째 해결 방법이 분명히 작동하므로 저는 지금 매우 어리 석습니다. 나는 쉘 스크립팅에 비교적 익숙하지 않다. 그리고 언급 한 첫 번째 해결책이 차단되지 않는다는 사실을 깨닫지 못했다. 고마워! – RobAu

관련 문제