发现了flock这个小命令

无意中发现flock这个小命令,搜索一番,发现还挺有意思,就看看资料,学习了下。下面简单的说下如何使用flock保证进程的唯一性,至于其他功能,等有时间,再细研究了。

之前写脚本在crontab中运行时,由于怕脚本执行时间过长,后台会堆积一堆的脚本进程,就会使用touch一个文件判断文件是否存在的方式来保证系统中只会有一个脚本进程(还没到检查脚本进程pid的地步…)。看了flock这个命令后,才发现之前的方法太挫了,哪有用flock简单明了,一条命令就解决问题了。

一:使用flock -xn /tmp/test.lock -c '/bin/sh /tmp/test.sh' 方式执行脚本,保证脚本进程唯一

先写个脚本test.sh,内容如下:

#!/bin/bash

while :;do
   sleep 1
done

在一个终端里先运行下,可以发现终端一直在闪,脚本一直在执行:

[root@cmcc tmp]# flock -xn /tmp/test.lock -c '/bin/sh /tmp/test.sh'

然后,换个终端,再执行下,发现一执行就退出,因为/tmp/test.lock被加了排它锁,得不到,就会退出:

[root@cmcc tmp]# flock -xn /tmp/test.lock -c '/bin/sh /tmp/test.sh'
[root@cmcc tmp]# flock -xn /tmp/test.lock -c '/bin/sh /tmp/test.sh'
[root@cmcc tmp]# flock -xn /tmp/test.lock -c '/bin/sh /tmp/test.sh'

二:当然也可以将flock写到脚本里面

看了文后的参考链接,把里面提到的保证脚本只会存在一个进程的脚本,抄到这里,做个备份:

#!/bin/bash

set -e

scriptname=$(basename $0)
lock="/var/run/${scriptname}"

exec 200>$lock
flock -n 200 || exit 1

## The code:
pid=$$
echo $pid 1>&200
sleep 10
echo "Hello world"

结束语:

从看到的资料,大家对flock的用法有下面两种(当然太多的资料我也没看,权当个引子,有时间再研究):

1.对某个文件加排它锁,用于确保某个脚本只运行一次,例如crontab中每分钟运行某个脚本,如果脚本运行时间比较长,又不做处理,一段时间后,ps可以看到会出现一堆该脚本的进程。

2.对某个文件加排它锁或共享锁,做任务的串行或者并行处理。


参考资料:

flock——Linux 下的文件锁:http://lilydjwg.is-programmer.com/2013/7/26/flock-file-lock-in-linux.40104.html

Linux shell: Introduction to Flock:http://linuxaria.com/howto/linux-shell-introduction-to-flock

通过文件锁 Lockfile/flock 让脚本单实例运行:http://my.oschina.net/leejun2005/blog/108656

Linux 小撇步:利用flock來做同步和非同步應用:https://rpubs.com/wush978/flock