NAND 플래시가 rootfs로 내장된 장치가 있습니다. 로그 파일은 일반적으로 지루하고 플래시 메모리를 소모할 수 없기 때문에 RAM에 보관됩니다. 그러나 장치가 디버깅이 필요한 결함 상태로 들어가는 경우는 거의 없습니다. 그래서 오류가 발생하면 /var/log/messages
쉘 스크립트(busybox bash)를 NAND에 복사합니다.
여태까지는 그런대로 잘됐다. 불행하게도 하나의 오류가 발생하면 감시 장치가 시스템을 다시 시작하기 전에 수백 또는 수천 번의 충돌이 발생할 수 있습니다. 가능한 한 충돌이 발생한 지점에 가깝게 로그 파일을 조사하고 싶지만 전체 로그 파일을 수천 번 복사하는 것이 아니라 한 번만 복사한 다음 모든 새 메시지를 해당 파일에 추가하고 싶습니다.
당신은 무엇을 할 것인가? 라인 카운터를 저장하고 파일이 이미 존재하는 경우에만 라인 카운터 뒤에 라인을 추가하는 것을 고려할 수 있지만(그런 다음 라인 카운터를 업데이트하는 경우) 이를 수행하는 더 현명한 방법이 있을까요?
답변1
tail -f
파일을 복사하는 동일한 오류 처리 코드에서 복사된 로그 파일에 후속 행을 추가하기 위해 백그라운드 프로세스를 시작할 수 없습니까 ? 그것은 다음과 같습니다:
tail -c +$(( $(wc -c COPIED_LOG | awk '{print $1}')+1 )) -f /var/log/messages >> COPIED_LOG
COPIED_LOG
복제된 로그 파일이 저장되는 경로는 어디에 있습니까? tail
발견된 -번째 바이트부터 시작하도록 출력을 지시합니다 -c +N
. 여기서는 복사 파일( )에 이미 있는 바이트 수에 1을 더해 새 콘텐츠가 시작되는 바이트를 가져옵니다. 그런 다음 사용에 추가하십시오.N
/var/log/messages
wc -c COPIED_LOG | awk '{print $1}'
COPIED_LOG
>>
nohup ... &
백그라운드 프로세스로 실행되도록 하려면 랩핑하거나 이와 유사한 것을 수행해야 합니다 . 또한 귀하의 질문에서 이미 말씀하신 것처럼 COPIED_LOG
이미 존재하는지 확인하고 그렇지 않은 경우 이 백그라운드 프로세스를 실행하십시오.