echo > 파일이 파일이 존재하지 않는다고 불평합니다.

echo > 파일이 파일이 존재하지 않는다고 불평합니다.

루트가 설치된 실행 중인 가상 머신이 있습니다../vm

가상 머신에서 이 스크립트를 실행하고 있습니다.

#!/usr/bin/env bash
flag=/dir/flag
echo "Listening..."
while true; do
    while [[ ! -f "$flag" ]]; do
        sleep 2
    done;
    cat "$flag"
    rm -f "$flag"
done

호스트에는 다음이 있습니다.

#!/usr/bin/env bash
arrayA=( a b c d )
arrayB=( w x y z )
while true; do
    for i in $(seq 0 $((${#arrayA[@]} - 1 ))); do
        rm -rf ./vm/dir/*
        sync
        echo "${arrayB[i]}" > ./vm/dir/flag
        read -p "press [Enter]"
    done
done

내가 겪고 있는 문제는 때때로 호스트의 스크립트가 나에게 소리를 지르는 것입니다.

./host.sh: line ..: vm/dir/flag: No such file or directory

이 문제를 해결하는 방법을 모르겠습니다. 모든 곳에 삽입 syncs하지만 가끔(항상 그런 것은 아님) [Enter] 키를 누른 후 플래그가 기록되지 않았고 가상 머신이 아무 작업도 수행하지 않는다는 오류 메시지가 나타납니다.

답변1

경쟁 조건이 있는 것 같습니다. 호스트는 1/을 실행하여 ./vm/dir/*을 확장한 다음 2/를 실행하여 rm파일을 찾습니다. 가상 머신이 1/과 2/ 사이에 파일을 삭제하면 호스트에 오류가 표시됩니다.

자주 발생해서는 안 되지만(시간을 고려하면 너무 자주 발생한다는 사실에 놀랐습니다. sleep, read) 불가능하지는 않습니다.

참고: 다른 것을 작성하려면 rm 플래그가 필요하지 않습니다. 직접 수행하십시오 echo … > ./vm/dir/flag(문제가 발생할 수 있습니다. 여기에는 파일을 다시 열고 파일에 쓰는 두 단계가 포함됩니다. 경쟁 조건을 피하는 가장 좋은 방법은 flag2 파일을 생성하고 준비가 되면 플래그 이름을 바꾸는 것 같습니다. 하지만 cat여기서는 빈 파일을 사용해도 아무런 해가 없는 것 같습니다)

편집: 귀하의 것입니까 , 아니면 오류를 나타냅 echo니까 ? rmEcho는 디렉터리가 존재하지 않는 경우에만 오류를 표시해야 합니다.

관련 정보