루트가 설치된 실행 중인 가상 머신이 있습니다../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
니까 ? rm
Echo는 디렉터리가 존재하지 않는 경우에만 오류를 표시해야 합니다.