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から2/の間にファイルを削除すると、ホストにエラーが表示されます。

頻繁に発生してはいけませんが(時間を考慮するとあまりにも頻繁に発生するという事実に驚きました。sleepread)不可能ではありません。

注:他のものを作成するにはrmフラグは必要ありません。直接実行してください(問題が発生する可能性があります。これにはecho … > ./vm/dir/flag、ファイルを再度開いてファイルに書き込む2つの手順が含まれます。競合状態を回避する最善の方法は、flag2ファイルを作成し、準備ができたらフラグの名前を変更するようです)。cat空のファイルを使っても何の害もないようです)

編集:あなたのものですか、それともエラーを示していますecho か?rmEchoは、ディレクトリが存在しない場合にのみエラーを表示する必要があります。

おすすめ記事