由于后台进程导致输出错误

时间:2013-06-25 18:39:52

标签: bash multiprocessing

如果我使用./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

increment.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之类的东西 我工作得不好,我不知道如何修复它。

1 个答案:

答案 0 :(得分: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中截断,并且上述访问模式的混合可能会冒犯某些人 - 但是以上避免了重大错误。