최신 파일의 마지막 몇 줄을 볼 수 있도록 디렉터리의 파일을 연속적으로 연결하려면 어떻게 해야 합니까?

최신 파일의 마지막 몇 줄을 볼 수 있도록 디렉터리의 파일을 연속적으로 연결하려면 어떻게 해야 합니까?

Twitter를 듣고 특정 키워드가 포함된 트윗을 JSON 파일에 저장하는 스크립트가 있습니다. 스크립트가 시작될 때마다 새로운 대상 파일이 생성됩니다.

때때로 내 스크립트가 충돌하고 자동으로 다시 시작되어 프로세스에서 새 JSON 파일이 생성됩니다.

들어오는 트윗의 실행 로그를 표시하고 싶습니다. 단일 파일을 사용하여 다음을 수행할 수 있습니다( jqJSON에서 단일 필드만 표시 하도록 파이프 ).

tail -f file1.json | jq '.text'

그러나 스크립트가 충돌하고 다시 시작되면 새 파일이 생성되고(예: file2.json) 위 명령은 더 이상 업데이트되지 않는 파일을 수신합니다.

이 문제를 해결하려면 디렉터리에 있는 모든 파일과 tail -f | jq '.text'결과를 연결해야 한다고 생각했습니다.

그러나 나는 비록할수있다cat *현재 폴더에 있는 모든 파일을 연결하려면 새 파일이 자동으로 연결에 추가되지 않는 것 같습니다.

항상 최신 파일의 최신 행을 볼 수 있도록 폴더의 모든 파일을 연속적으로 연결하려면 어떻게 해야 합니까?

답변1

이 솔루션은 이식성이 없는 tail -F(예:) 것을 사용합니다. tail --follow=name --retry테스트에는 GNU를 사용하십시오 tail.

다음과 같이 진행해주세요:

  1. monitored일반 파일로 생성 :

    : >>monitored
    
  2. file*.json주기적으로 파일이 있는지 확인하십시오 monitored. 그렇다면 monitored파일에 대한 하드 링크로 바꾸십시오.

    while sleep 1; do
        find . \( -name . -o -prune \) -name 'file*.json' -newer monitored -exec ln -f {} monitored \;
    done
    

    위의 루프는 백그라운드에서 실행될 수 있습니다.

  3. monitored이름으로 모니터링:

    tail -F monitored
    

    jq '.text'파이프 나 다른 수단을 통해 수행할 수 있습니다 .

노트:

  • 귀하의 명확한 질문은 다음과 같습니다

    항상 최신 파일의 최신 행을 볼 수 있도록 폴더의 모든 파일을 연속적으로 연결하려면 어떻게 해야 합니까?

    내 솔루션이 "지속적으로 연결"되지 않습니다. 그러나 "최신 파일의 최신 행을 볼 수 있습니다".

  • 같은 초에 많은 파일이 생성/업데이트되는 경우 각 파일이 한 순간만 표시된다는 file*.json보장이 없으며 일부 파일은 건너뛸 수 있습니다. monitored그러나 귀하의 스크립트가 때때로 충돌하고 자동으로 다시 시작되므로 한 번 다시 시작할 때부터 다음 번 다시 시작할 때까지 1초 이상 걸릴 수 있다는 점을 이해합니다. 그러면 문제가 없습니다.

    일반적으로 문제가 발생할 수 있습니다. "최신 파일" 상태가 한 파일에서 다른 파일로 너무 자주 이동하는 경우 이 솔루션이 완전히 신뢰할 수 없다는 점을 분명히 했습니다.

답변2

현재 디렉토리의 모든 파일을 보려면 다음 구조를 사용하십시오.

ls | cat - <(inotifywait -m --format '%f' -e create . ) | while read file ; do tail -v -f "$file" & done

참고하시기 바랍니다확실히감시 디렉터리에 하위 디렉터리를 포함하는 기능을 지원합니다.

답변3

이것카밀의 대답하드 링크 및 tail -F.

나는 다음 솔루션을 채택했습니다.

  1. 그리고watch최신 파일에 대한 하드 링크를 주기적으로 다시 생성합니다.
watch -n 300 'ln -f $(find . | sort --reverse | head -n1) ./latest.json'
  1. tail -F하드 링크된 파일의 최신 줄을 계속 보려면 :
tail -F latest.json | jq '.text' 

관련 정보