我试图理解为什么我似乎无法成功实现用于flock
避免竞争条件的计数器。
我flock
从这个 SO 答案中复制了代码。
计数器似乎会随机重置,尽管我不明白为什么它会这样做。counter inc
应该永远自动计数。
我的代码旨在让我能够使用同时处理多个文件GNU parallel
,但是使用包含递增计数器的每个处理文件来更新状态行。
该计数器保存到由 创建的 RAM 中的临时文件中mktemp
。
我在这里把它剪短了,所以它只是一个应该永远计数的无限循环,但它会不断重置。
谁能向我解释为什么计数器有时会重置?
#!/bin/bash
clear_line () {
echo -ne "\r\033[K"
}
counter () {
{
flock -s 200
read numfiles < "$countfile"
if [ "$1" = "inc" ]; then
((numfiles++))
fi
if [ "$1" = "rst" ]; then
numfiles=0
fi
if [ "$1" = "get" ]; then
echo "$numfiles"
fi
echo "$numfiles" > "$countfile"
} 200> "$countlockfile"
}
process () {
counter inc
currfileno=$(counter get)
clear_line
echo -n "$currfileno"
}
# from https://unix.stackexchange.com/a/29918/52247
tmpdir=
cleanup () {
trap - EXIT
if [ -n "$tmpdir" ] ; then rm -rf "$tmpdir"; fi
if [ -n "$1" ]; then trap - $1; kill -$1 $$; fi
}
tmpdir=$(mktemp -dt "$(basename $0).XXXXXXXX" --tmpdir=/run/user/$(id -u)) || exit 1
countfile=$(mktemp -t "counter.XXXXXXXX" --tmpdir=$tmpdir) || exit 1
countlockfile=$(mktemp -t "countlockfile.XXXXXXXX" --tmpdir=$tmpdir) || exit 1
trap 'cleanup' EXIT
trap 'cleanup HUP' HUP
trap 'cleanup TERM' TERM
trap 'cleanup INT' INT
export -f clear_line
export -f process
export -f counter
export countfile
export countlockfile
counter rst
while :
do
echo whatever
done | parallel process