我lockfile在 linux 中使用命令来管理对特殊文件的访问。
当我的主脚本由于某种原因崩溃时,我完成了挂锁,以防止主脚本的任何新启动并严重影响其执行。
有没有办法存储我的锁定文件进程的 PID,以便我可以在重新启动我的主要脚本之前跟踪它们并进行适当的清理。
希望我足够清楚...
这是一个脆弱的机制。我更喜欢使用真正的文件锁,所以当拥有它们的进程死亡时,O/S 会自动释放锁。在 perl 中很容易做到(使用 flock 函数),但我不知道在 Bash 中是否可行。
更重要的是,我想你可以使用锁文件本身来保存持有锁的脚本的 PID,对吧?
(我不怎么做shell脚本......我认为下面的代码大部分是正确的,但使用风险自负。有竞争条件。)
while [[ lockfile -! -r 0 lock.file ]]
do
kill -0 `cat lock.file`
if [[ $? -ne 0 ]]
then
# process doesn't exist anymore
echo $$ >lock.file
# do something important
rm -f lock.file
break
fi
sleep 5
done
或者,这个怎么样:
while [[ true ]]
do
if [[ ! -e pid.file ]]
then
echo $$ > pid.file
else
if [[ kill -0 `cat pid.file`]]
then
# owner process exists
sleep 30
else
# process gone, take ownership
echo $$ > pid.file
# ### DO SOMETHING IMPORTANT HERE ###
rm -f pid.file
break
fi
fi
done
我更喜欢第二个。它仍然远非完美(很多竞争条件),但如果没有太多进程争夺锁,它可能会起作用。此外,如果可能的话,睡眠 30应该在其中包括一些随机性(睡眠的长度应该具有随机分量)。
但是请看这里,看起来您可以将 flock 与某些版本的 shell 一起使用。这与我在 perl 中所做的类似,并且比我能想到的替代方案更安全。