shell文件锁

在shell中实现文件锁有两种方式,一种是用普通文件来判断,另一种是使用flock命令

1. 普通文件判断

#!/bin/ksh

if [ ! -f $LOCK_FILE ]; then

#不存在锁文件,则直接产生锁
echo $$>$LOCK_FILE

else

#存在琐文件,判断锁文件中所指的PID进程是否存在,直到进程退出停止判断,继续后续执行。
  cat $LOCK_FILE|read sh_pid #输入锁文件里的pid
  p_cn=`ps -ef |awk '{if ($2 == '$sh_pid') print $3}'|wc -l`#判断该子进程的个数
  while (($p_cn))#如果还存在这个子进程,就sleep 60秒,再检查子进程个数,直到个数为0为止
  do
    sleep 60
    p_cn=`ps -ef |awk '{if ($2 == '$sh_pid') print $3}'|wc -l`
  done
#原进程退出,写入新PID加锁
   echo $$>$LOCK_FILE

fi

2. flock命令


flock的两种使用格式分别为:
 

flock [-sxon] [-w timeout] lockfile [-c] command...
flock [-sxun] [-w timeout] fd[code]

介绍一下参数:
-s    为共享锁,在定向为某文件的FD上设置共享锁而未释放锁的时间内,其他进程试图在定向为此文件的FD上设置独占锁的请求失败,而其他进程试图在定向为此文件的FD上设置共享锁的请求会成功。
-e    为独占或排他锁,在定向为某文件的FD上设置独占锁而未释放锁的时间内,其他进程试图在定向为此文件的FD上设置共享锁或独占锁都会失败。只要未设置-s参数,此参数默认被设置。
-u    手动解锁,一般情况不必须,当FD关闭时,系统会自动解锁,此参数用于脚本命令一部分需要异步执行,一部分可以同步执行的情况。
-n    为非阻塞模式,当试图设置锁失败,采用非阻塞模式,直接返回1,并继续执行下面语句。
-w    设置阻塞超时,当超过设置的秒数,就跳出阻塞,返回1,并继续执行下面语句。
-o    必须是使用第一种格式时才可用,表示当执行command前关闭设置锁的FD,以使command的子进程不保持锁。
-c    执行其后的comand。


Example:

exec 9>$LOCKFILE

flock -n -e 9 #设置锁失败时,返回1;设置锁成功时,返回0

if [ $? -eq 1 ];then

    echo "Tere is another script running,exit!"

fi


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值