1

スクリプトを実行すると./test.sh 100、スレッドを使用しているため、出力 100 が得られません。期待される出力を得るにはどうすればよいですか? (変わらなくていいtest.shけど。)

test.sh

#!/bin/bash
FILE="number.txt"
echo "0" > $FILE
for (( x=1; x<=$1; x++)); do
    exec "./increment.sh" $FILE &
done
wait
cat $FILE

インクリメント.sh

#!/bin/bash
value=(< "$1")
let value++
echo $value > "$1"

編集

さて、私はこれを試しました:

#!/bin/bash
flock $1 --shared 2>/dev/null
value=(< "$1")
let value++
echo $value > "$1"

現在、私が使用すると常に98 99のようなものが得られ、./test.sh 100 うまく機能せず、修正方法がわかりません。

4

1 に答える 1

2

test.sh本当に改善できない場合は、の各インスタンスがincrement.sh$FILE への独自のアクセスをシリアル化する必要があります。

ファイルシステムのロックは、UNIX でこれを解決するための明白なソリューションです。ただし、これを実現するための組み込みのシェルはありません。代わりに、 flocksetlock、またはchpst -l|-Lなどの外部ユーティリティ プログラムに依存する必要があります。例えば:

#!/bin/bash
(
  flock 100          # Lock *exclusively* (not shared)
  value=(< "$1")
  let value++
  echo $value > "$1"
) 100>>"$1"          # A note of caution

注意点: 変更するファイルをロックファイルとして使用すると、すぐにトリッキーになります — 意図せずにシェル内で簡単に切り詰められてしまい、上記のアクセスモードの混合は一部の人々を怒らせるかもしれません — しかし、上記は回避しますひどい間違い。

于 2013-06-25T18:51:52.407 に答える