루프가 작동하지 않음 [닫기]

루프가 작동하지 않음 [닫기]

이 루프가 가끔 제대로 작동하지 않기 때문에 뭔가 빠졌나요?

#!/bin/bash

Data="/path/to/data.txt"
while true
do
    if [ -f "$Data" ]; then
        rows=$(tail -n +1 "$Data" | wc -l)
            if [ "$rows" = 0 ]; then
                    rm "$Data"
                else
                        line=$(sed -e 1p $Data);
                        IFS=', ' read -a array <<< "$line";
                        exec > >(tee /var/www/report.txt) 2>&1
                        bash -c "/path/to/program.sh -i ${array[0]} -p ${array[1]} -r ${array[2]} -t ${array[3]}" | rm "$Data"
            fi
    fi
   sleep 1
done

무한 루프의 목적은 이 스크립트를 호출할 때 이를 백그라운드 프로세스로 사용하기 때문입니다.

답변1

내가 올바르게 이해했다면 일부 프로세스는 귀하가 명명한 파일을 덮어쓰고 $Data있으며 귀하는 새로운 콘텐츠가 나타날 때마다 명령을 호출하려고 시도하고 있는 것입니다. 게시한 코드에는 tail-wc 테스트와 sed 라인 추출 사이에 전달되는 경쟁 조건이 있습니다.

다음과 같이 요구 사항을 변경하는 것이 좋습니다.

  • 파일을 덮어쓰는 대신 파일에 줄을 추가하는 스크립트를 작성하고

  • 읽기 스크립트는 tail을 사용하여 새로 작성된 줄을 읽습니다. 비슷한 것을 사용할 수 있습니다 tail -f "$Data" | while read ....

관련 정보