如果我使用./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之类的东西
我工作得不好,我不知道如何修复它。
答案 0 :(得分:2)
如果test.sh
确实无法改进,那么increment.sh
的每个实例都必须序列化它自己对$ FILE的访问权。
在UNIX下,文件系统锁定是明显的解决方案。但是,没有内置的shell来实现这一目标。相反,您必须依赖外部实用程序,例如flock,setlock或chpst -l|-L。例如:
#!/bin/bash
(
flock 100 # Lock *exclusively* (not shared)
value=(< "$1")
let value++
echo $value > "$1"
) 100>>"$1" # A note of caution
请注意:使用您将要修改的文件作为锁定文件很快就会变得棘手 - 当您不想要时,很容易在shell中截断,并且上述访问模式的混合可能会冒犯某些人 - 但是以上避免了重大错误。