假设shell脚本A中的一段代码设置有文件锁,在此文件锁的后面(外部)以后台运行的方式调用了脚本B(此脚本中也有文件锁,但是与脚本A的锁文件不是同一个文件),并且脚本B执行时间相当之长,那么,在后台运行的脚本B在结束之后,是否会导致脚本A无法启动第二个进程呢?

下面就来做一个简单的试验,以确定上面的问题。

脚本A(parent.sh)内容如下:

#!/bin/sh
SHELL_DIR="/root/"
LOCKFILE_1=$SHELL_DIR".lock1"
{
    echo "Go into lock1."
    if ! flock -n 4; then
        echo "*** Shell is running, quit."
        exit 1
    fi
} 4<>$LOCKFILE_1

$SHELL_DIR"child.sh" &      # run shell B on background 

文章来源:http://www.codelast.com/

脚本Bchild.sh)内容如下:

#!/bin/sh
SHELL_DIR="/root/"
LOCKFILE_2=$SHELL_DIR".lock2"
{
    echo "Go into lock2."
    sleep 1000
    echo "Sleep done."
} 5<>$LOCKFILE_2

然后运行脚本A:

./parent.sh

脚本B运行中,会暂停(sleep)1000秒,因此它会卡在那里,但是它是以后台方式运行的,并不会影响脚本A的终止。就算脚本B没有结束,你也可以再启动任意多个脚本A,并且你不会看到“Shell is running, quit”的提示,此外,你还可以查看到进程中有N个child.sh在运行(ps -ef | grep child.sh)。这说明在脚本B使用另一个文件锁、并且以后台方式被脚本A调用的情况下,不会对脚本A的文件锁造成影响。

但是,如果你把脚本A中的“$SHELL_DIR"child.sh" &”这句调用脚本B的语句放到锁的内部(即两个大括号中间)呢?答案是与上面相反的,即:脚本B没有结束之前,脚本A会被锁住,你将会看到打印出“Shell is running, quit”的提示。

文章来源:http://www.codelast.com/

[原创]后台运行的shell脚本对文件锁的影响
Tagged on:                             

发表评论

电子邮件地址不会被公开。 必填项已用*标注