假设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/
脚本B(child.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”的提示。
文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤
转载需注明出处:codelast.com
感谢关注我的微信公众号(微信扫一扫):
文章来源:http://www.codelast.com/