echo > file 抱怨文件不存在

echo > file 抱怨文件不存在

我有一个正在运行的虚拟机,其根目录安装在./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/之间的文件,则主机指示错误。

它不应该经常发生(我很惊讶它会如此频繁地发生,考虑到时间:sleepread),但这并非不可能。

注意:如果您想编写其他内容,则不需要 rm 该标志。只需直接执行echo … > ./vm/dir/flag(您可能会遇到问题:这涉及两个步骤:重新打开文件,写入文件。避免竞争条件的最佳方法似乎是创建一个 flag2 文件,当它准备好时,将其重命名为 flag。但是这里使用caton空文件似乎没有什么害处)

编辑:是你的echo还是你的rm这表明有错误?仅当目录不存在时,Echo 才应指示错误。

相关内容