【发布时间】:2010-12-01 05:41:13
【问题描述】:
shell script 的修改版本将音频文件从 FLAC 转换为 MP3 格式。该计算机具有四核 CPU。该脚本使用以下方式运行:
./flac2mp3.sh $(find flac -type f)
这会将flac 目录中的FLAC 文件(文件名中没有空格)转换为mp3 目录中的MP3 文件(与flac 处于同一级别)。如果目标 MP3 文件已存在,则脚本将跳过该文件。
问题是有时脚本的两个实例几乎同时检查是否存在同一个 MP3 文件,从而导致 MP3 文件损坏。
您将如何多次运行脚本(即每个内核一次),而不必在每个命令行上指定不同的文件集,并且不覆盖工作?
更新 - 最小竞争条件
脚本使用以下锁定机制:
# Convert FLAC to MP3 using tags from flac file.
#
if [ ! -e $FLAC.lock ]; then
touch $FLAC.lock
flac -dc "$FLAC" | lame${lame_opts} \
--tt "$TITLE" \
--tn "$TRACKNUMBER" \
--tg "$GENRE" \
--ty "$DATE" \
--ta "$ARTIST" \
--tl "$ALBUM" \
--add-id3v2 \
- "$MP3"
rm $FLAC.lock
fi;
但是,这仍然存在竞争条件。
【问题讨论】:
标签: linux bash shell multiprocessing race-condition