我在linux中使用lockfile
命令来管理对特殊文件的访问。
当我的主要脚本由于某种原因崩溃时,我完成了挂起锁定,阻止了主要脚本的任何新启动,并严重影响了它的执行。
有没有办法存储我的锁定文件进程的PID,以便我可以跟踪它们并在重新启动我的主要脚本之前进行适当的清理。
希望我足够清楚......
答案 0 :(得分:0)
这是一个脆弱的机制。我更喜欢使用真正的文件锁,所以当拥有它们的进程死掉时,O / S会自动释放锁。在perl中很容易做到(使用flock函数),但我不知道它是否可以在Bash中使用。
更重要的是,我想你可以使用lockfile本身来保存持有锁的脚本的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
我更喜欢第二个。它仍然远非完美(很多竞争条件),但如果没有太多的进程争夺锁定,它可能会起作用。此外, sleep 30 应该包含一些随机性,如果可能的话(睡眠的长度应该有一个随机的组件)。
但请看这里,it looks like you can use flock with some versions of the shell。这与我在perl中所做的类似,它比我能想到的althernative更安全。