![루프가 작동하지 않음 [닫기]](https://linux55.com/image/64449/%EB%A3%A8%ED%94%84%EA%B0%80%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%9D%8C%20%5B%EB%8B%AB%EA%B8%B0%5D.png)
이 루프가 가끔 제대로 작동하지 않기 때문에 뭔가 빠졌나요?
#!/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 ...
.