2013-03-08 4 views
1

제 요구 사항은 cron 작업의 쉘 스크립트를 사용하여 지속적으로 업데이트되는 큰 파일을 읽는 것입니다. 마지막으로 사용 가능한 줄까지 읽은 다음 프로세스를 중지합니다. 다음에 cron 작업이 시작되면 작업은 마지막으로 완료된 위치에서 읽어야합니다. 어떤 제안 쉘 스크립트에서 어떻게 할 수 있습니다.쉘 스크립트를 사용하여 마지막 위치에서 파일을 읽으십시오.

Solaris Unix를 사용하고 있습니다.

+2

이전 파일 크기를 저장하고'tail -c + $ filesize logfile'을 사용하십시오. – Barmar

+0

왜 'cron'으로 복잡한 일이 생길까요? 프로세스를 시작하고 파일의 끝까지 읽은 다음 일정 시간 동안 잠자기 (파일을 열린 상태로 유지)하십시오. 깨어 났을 때 파일 위치에서 더 많은 데이터를 읽습니다. 파일 위치는 잠자기 시점이었습니다. –

+0

또는''read, sleep ''사이클을 자동화하는 파이프'tail -f'. – Barmar

답변

0

이미 표시된 가장 좋은 방법은 "꼬리 -f"를 사용하는 것입니다,하지만 프로그램이 사망 어떤 이유로, 당신은 처음부터 읽기 시작해야한다는 것을 가정하고 계속하려면 "꼬리 -f"를 사용할 수없는 어디에서 멈췄다.

그래서 유일한 방법은 자신의 C 응용 프로그램을 작성하는 것입니다. 오히려 간단하기 때문에 충분히 쉬워야합니다. "ftell"을 사용하여 데이터 파일의 현재 위치를 확인할 수 있습니다. 그런 다음 응용 프로그램을 종료하기 전에 또는 모든 읽기 후에 결과를 다른 파일 (제어 파일)에 기록합니다 (다시 행을 다시 처리하지 않도록하는 것이 중요 할 경우).

응용 프로그램을 다시 시작하면, 당신은 그 제어 파일을 읽은 값을 구문 분석하고 중단 한 부분 점프 "fseek과"을 사용합니다. 데이터 파일이 다른 응용 프로그램에 의해 잘립니다

경우, 당신은 또한 당신의 제어 파일을 제거하는 응용 프로그램을 얻어야한다. 그렇지 않으면 파일이 새로운 것임을 알 수있는 다른 방법을 찾아야합니다. 당신이 읽는 "fseek"가 현재의 "ftell"보다 더 큰 파일 일 수도 있습니다. 이것은 파일이 그보다 작다는 것을 나타낼 지 모르지만 그것은 모든 우발적 사건을 다루지는 않습니다.

"fstat"를 조사하고 데이터 파일의 생성 시간을 사용하여 제어 파일 또는에 저장했을 때의 생성 시간보다 새로운 지 확인할 수 있습니다. 가능한 경우 날짜/파일의 첫 번째 줄에 타임 스탬프를 추가하고 제어 파일에도이 스탬프를 씁니다. 응용 프로그램이 다시 시작되면 첫 번째 줄의 타임 스탬프가 제어 파일의 타임 스탬프와 일치하지 않으면 처음부터 읽습니다. 그렇지 않으면 "fseek"가 올바른 위치로 이동해야합니다.

1

은 (크론에 추가 물론)이 같은 시도 :

#!/bin/bash 

#STAT_FILE=/tmp/stat.tmp 
PREV_LINE_STAT=/tmp/prev_last_line.tmp 
LINE=$(cat log | wc -l) 
LOG=/tmp/log.tmp 

if [ -f $PREV_LINE_STAT ] 
then 
    PREV_LINE=$(cat $PREV_LINE_STAT) 
else 
    PREV_LINE=0 
fi 

declare -i LINE_RANGE 
LINE_RANGE=$LINE-$PREV_LINE 


if [ $LINE_RANGE -lt 0 ] 
then 
    LINE_RANGE=$LINE 
fi 

tail -n $LINE_RANGE log > $LOG 

COUNT1=$(grep any_word $LOG |wc -l) 

echo "------------------- 
LINE_RANGE is $LINE_RANGE 
------------------- 
number of words 
$COUNT1" > test.txt 

echo $LINE > $PREV_LINE_STAT 

cat test.txt 

그래서 "꼬리"기본 도구가있다. 질문이 있으시면 저에게 물어보십시오.

+0

'tail -n'은 파일을 처음부터 읽을 것을 요구합니다; 파일이 크기 때문에 시간이 오래 걸릴 수 있습니다. 따라서'tail -c' (Barmar가 위에 제안한대로)가 더 좋을 수 있습니다. – Armali

관련 문제