예를 들어 쉘 스크립트가 file.txt에 데이터를 추가한다고 가정합니다.
1...........
2...........
3.............
4.............
5..............
이제 전체 데이터 대신 5초 내에 file.txt에 추가된 새 데이터를 확인할 수 있는 다른 스크립트가 필요합니다.
tail -f
전체 데이터를 표시 하는 옵션이 있는지 모르겠습니다 .
-5와 같은 것을 이해하는 데 유용한 것은 tail -5 file.txt
줄 수가 아니라 초 수입니다.
참고: 마지막에 남은 데이터를 제공해야 할 때마다 데이터를 놓치고 싶지 않습니다. 이건 중요하다.
답변1
retail
는상태 저장 tail
. 각 호출 후에 inode 번호와 파일 크기를 기록하고 다음 호출은 중단된 부분부터 계속됩니다(선택적으로 회전하는 파일도 처리하므로 inode가 기록됩니다).
while true; do
retail myfile.log
sleep 5
done
retail
파일 데이터 자체에 타임스탬프(syslog를 통한 경우일 수 있음)나 단조롭게 증가하는 ID가 포함되어 있지 않은 한 파일 크기를 사용하여 일부 외부 상태가 있어야 합니다 .
파일이 한 줄씩만 추가되고 플러시된다고 가정하면 retail
데이터가 손실되지 않습니다. 또한 정밀도가 높지 않은 경우(예: µs 이상) 데이터의 타임스탬프를 확인하는 것보다 더 안정적이어야 합니다.
retail
C로 작성되었으며 @Ulrich Dangel의 제안과 유사합니다 logtail
. 두 가지 다른 버전이 있는 것 같습니다. 둘 다 Perl로 구현되었지만 둘 중 어느 것도 사용하지 않았습니다.
답변2
마지막 5개를 추출할 수 있습니다.철사스크립트에서는 tail -n 5
파일의 마지막 변경 사항에만 타임스탬프가 기록되며 모든 변경 사항은 그렇지 않습니다. 마지막으로 검색하고 싶다면N초 단위로 별도로 보관해야 합니다.
데이터를 수량화할 수 있습니다. 예를 들어, 스크립트는 매초마다 시작되는 메인 루프에 함수를 생성합니다.
CSEC=`date +%S`
if [ "x$CSEC" != "x$SAVEDSEC" ] ; then
mv f4.txt f5.txt
mv f3.txt f4.txt
mv f2.txt f3.txt
mv f1.txt f2.txt
echo $BUFFER > f1.txt
BUFFER=
SAVEDSEC=$CSEC
fi
예를 들어 데이터가 기록되는 위치에는 echo
해당 데이터가 버퍼에도 추가됩니다.
echo $DATA >file.txt
BUFFER=$BUFFER$DATA
(그리고 쓰기는 "file.txt"에 쓰는 대신 $BUFFER에 저장됩니다)
이 경우 스크립트는 cat f?.txt
마지막 5초의 데이터를 검색할 수 있습니다.
물론 폐쇄에 유의하세요. 한 스크립트가 다른 스크립트의 디스크 작업 중에 데이터를 읽으면 데이터가 손상됩니다.
답변3
이것은 당신이 원하는 것을 정확하게 수행해야합니다 ...
#!/bin/bash
#This is the file we want to capture data from
TAILFILE=/path/to/input.txt
#This is the file we want to append to
OUTFILE=/path/to/output.txt
#How many seconds we want to tail the file
SECONDS=5
tail -F $TAILFILE >> $OUTFILE &
PID=$!
sleep $SECONDS
kill $PID