logo资料库

Linux下在shell脚本中设置锁的命令.docx

第1页 / 共2页
第2页 / 共2页
资料共2页,全文预览结束
Linux 下在 shell 脚本中设置锁的命令 两种格式分别为: flock [-sxon] [-w timeout] lockfile [-c] command... flock [-sxun] [-w timeout] fd 介绍一下参数: -s 为共享锁,在定向为某文件的 FD 上设置共享锁而未释放锁的时间内,其他进程试图 在定向为此文件的 FD 上设置独占锁的请求失败,而其他进程试图在定向为此文件的 FD 上 设置共享锁的请求会成功。 -e 为独占或排他锁,在定向为某文件的 FD 上设置独占锁而未释放锁的时间内,其他进 程试图在定向为此文件的 FD 上设置共享锁或独占锁都会失败。只要未设置-s 参数,此参数 默认被设置。 -u 手动解锁,一般情况不必须,当 FD 关闭时,系统会自动解锁,此参数用于脚本命令 一部分需要异步执行,一部分可以同步执行的情况。 -n 为非阻塞模式,当试图设置锁失败,采用非阻塞模式,直接返回 1,并继续执行下面 语句。 -w 设置阻塞超时,当超过设置的秒数,就跳出阻塞,返回 1,并继续执行下面语句。 -o 必须是使用第一种格式时才可用,表示当执行 command 前关闭设置锁的 FD,以使 command 的子进程不保持锁。 -c 执行其后的 comand。 举个实用的例子: #!/bin/bash { flock -n 3 [ $? -eq 1 ] && { echo fail; exit; } echo $$ sleep 10 } 3<>mylockfile 此例的功能为当有一个脚本实例正在执行时,另一个试图执行该脚本的进程会失败退出。 sleep 那句可以换成您需要执行的语句段。 这里请注意一点,我使用<>打开 mylockfile,原因是定向文件描述符是先于命令执行的。
因此假如在您要执行的语句段中需要读写 mylockfile 文件,例如想获得上一个脚本实例的 pid,并将此次的脚本实例的 pid 写入 mylockfile。此时直接用>代开 mylockfile 会清空上次 存入的内容,而用<打开 mylockfile 当它不存在时会导致一个错误。当然这些问题都可以用 其他方法解决,我只是点出这种最通用的方法。
分享到:
收藏