1

如果我运行脚本,./test.sh 100我不会得到输出 100,因为我正在使用线程。我该怎么做才能获得预期的输出?(但我不能改变test.sh。)

测试.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"

现在,如果我使用./test.sh 100 ,我总是得到类似 98 99 的东西,我工作得不是很好,我不知道如何解决它。

4

1 回答 1

2

如果test.sh真的无法改进,那么每个实例都increment.sh必须序列化它自己对 $FILE 的访问。

文件系统锁定是 UNIX 下明显的解决方案。但是,没有内置的 shell 可以完成此操作。相反,您必须依赖外部实用程序,如flocksetlockchpst -l|-L。例如:

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

注意事项:使用您将要修改的文件作为锁定文件会很快变得棘手——当你不打算这样做时,很容易在 shell 中截断,并且上述访问模式的混合可能会冒犯某些人——但上述避免了严重错误。

于 2013-06-25T18:51:52.407 回答