
ルートがインストールされている実行中の仮想マシンがあります。./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から2/の間にファイルを削除すると、ホストにエラーが表示されます。
頻繁に発生してはいけませんが(時間を考慮するとあまりにも頻繁に発生するという事実に驚きました。sleep
、read
)不可能ではありません。
注:他のものを作成するにはrmフラグは必要ありません。直接実行してください(問題が発生する可能性があります。これにはecho … > ./vm/dir/flag
、ファイルを再度開いてファイルに書き込む2つの手順が含まれます。競合状態を回避する最善の方法は、flag2ファイルを作成し、準備ができたらフラグの名前を変更するようです)。cat
空のファイルを使っても何の害もないようです)
編集:あなたのものですか、それともエラーを示していますecho
か?rm
Echoは、ディレクトリが存在しない場合にのみエラーを表示する必要があります。