파일에 반영된 내용이 새로 고쳐졌는지 어떻게 확인하나요? [폐쇄]

파일에 반영된 내용이 새로 고쳐졌는지 어떻게 확인하나요? [폐쇄]

동일한 시스템에서 실행 중인 두 명의 협력자 X와 Y가 있습니다. X는 때때로 Y를 사용하여 일부 정보를 계산합니다. 프로그램 간 파일 기반 통신을 사용하고 있습니다. X가 Y에게 무언가를 계산하기를 원하는 경우 프로세스는 다음과 같습니다.

  1. X는 작업 설명을 job.txt 파일에 기록하고 이를 공유 디렉터리에 저장합니다. 그런 다음 X는 동일한 디렉터리에서 Ready.txt 파일이 있는지 폴링하기 시작합니다.
  2. Y job.txt 파일이 존재하는지 폴링합니다. 파일이 나타나면 Y는 먼저 파일에서 작업 정보를 읽고 삭제합니다. 그런 다음 Y는 작업을 실행하고 결과를 result.txt에 저장합니다. 마지막으로 Y는 Ready.txt 파일을 생성하고 job.txt의 존재에 대해 다시 폴링을 시작합니다.
  3. X가 Ready.txt의 존재를 알아차리면 result.txt를 읽고 Ready.txt와 result.txt를 삭제한 다음 다른 작업을 계속합니다.

문제는 X가 때때로 비어 있거나 부분적인 결과 파일만 수신한다는 것입니다. Y는 bash 스크립트를 사용하며 현재 다음 작업을 수행합니다.

rm -f tmp_result.txt
for ((i=first; i <= last; i++)) # Each iteration produces 1 or more result lines
do
  # Compute something...
  echo "One result line with e.g. $values" >> tmp_result.txt
done
cp tmp_result.txt result.txt
touch ready.txt

즉, 에코 및 I/O 리디렉션을 사용하여 결과 파일의 내용을 한 번에 한 줄씩 임시 파일에 인쇄합니다. 내용이 준비되면(또는 준비되어야 합니다!) 최종 result.txt 파일에 복사되고 read.txt를 생성하여 X에 알립니다.

상당히 광범위한 실험과 인터넷 검색 후에도 X가 항상 완전한 결과를 받도록 하는 방법을 찾을 수 없습니다. 100번 중 1~5번은 X에서 result.txt를 완전히 비어 있거나(가장 일반적인 경우) 부분적인 결과만 포함하는 것으로 처리합니다.

스크립트 논리에 대한 몇 가지 설명: 원래 결과 줄을 result.txt에 직접 반영했지만 이는 매우 신뢰할 수 없습니다(결과 2개 중 1개는 불완전할 수 있음). 그런 다음 먼저 해당 행을 tmp_result.txt에 에코한 다음 tmp_result.txt를 result.txt로 이동(이름 변경)합니다. 이로 인해 결과 10개 중 약 1개가 불완전하게 됩니다. 위에 표시된 대로 파일 복사가 가장 잘 작동하지만 가끔 실패합니다.

그렇다면 X가 파일 읽기를 시작하기 전에 에코된 모든 줄이 result.txt에 올바르게 복사되었는지 어떻게 확인할 수 있습니까? Y 일부 핵심 bash 도구만 사용할 수 있습니다.

편집하다:2추가 댓글 3개

  1. 문제는 원시 결과에 있는 것이 아니라 X로 전송되는 방식에 있다는 것을 확인했습니다(예: tmp_result.txt를 삭제하지 않은 다음 검사하여).
  2. tmp_result.txt와 result.txt는 모두 tmpfs 기반 RAM 디스크에 있으므로 파일을 매우 빠르게 복사/이동하고 싶습니다.
  3. tmpfs(원래 모든 파일은 일반 하드 드라이브 파티션에 있음)를 사용하기 시작한 후 처음으로 이 문제가 발생했습니다.

답변1

이를 달성하기 위해 FIFO를 사용할 수 있는 것 같습니다.

mkfifo tasks

생산자:

for i in {1..10}; do echo "task$i"; done > tasks

소비자:

while read task; do echo "received $task"; done  <tasks

이렇게 하면 동기화 또는 삭제에 대해 걱정할 필요가 없으며 폴링에 CPU 시간을 낭비하지 않습니다. 데이터가 없거나 생산자가 FIFO를 열지 않은 경우 소비자가 차단됩니다(따라서 CPU 시간 절약). . FIFO가 가득 차거나 소비자가 FIFO를 열지 않은 경우 생산자는 차단됩니다.

답변2

sync와 사이에 명령을 넣어보세요 .cptouch ready.txt

관련 정보