我有一个正在运行的虚拟机,其根目录安装在./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 文件,当它准备好时,将其重命名为 flag。但是这里使用cat
on空文件似乎没有什么害处)
编辑:是你的echo
还是你的rm
这表明有错误?仅当目录不存在时,Echo 才应指示错误。