flock

shell命令flock通过加锁方式实现互斥访问。

常用语多进程间互斥访问。

flock用flock(2)系统调用实现。

用法

       flock [-sxon] [-w timeout] lockfile [-c] command...

       flock [-sxon] [-w timeout] lockdir [-c] command...

       flock [-sxun] [-w timeout] fd

参数

-s: 获取共享锁,有时被称为只读锁。

-x,-e:获取互斥锁,有时称为写锁。默认。

-u:释放锁。这个不是必须的,当文件关闭时(进程结束后,进程文件都被关闭)锁被自动释放。但是,特殊情况下是必须的,例如受锁保护的命令行fork一个后台进程,此进程不应该持有锁。

Drop  a  lock.   This is usually not required, since a lock is automatically dropped when the
file is closed.  However, it may be required in special cases, for example  if  the  enclosed
command group may have forked a background process which should not be holding the lock.
-n:非阻塞,获取锁失败后立刻返回,退出码1。

-w:seconds,等待超时。

-o:在执行命令前,关闭被锁文件的文件描述符。这是有用的,当时命令行fork一个子进程,该子进程不应该持有锁。

-c:传递一个单独command给shell(在shell中执行命令)。-c选项表示,如果成功锁定,则执行其后用双引号括起的命令,如果是多个命令,可以用分号分隔。

描述

该命令管理flock(2) locks为shell scripts或the command line。

第一或第二种形式在命令执行时回绕锁。它锁住指定文件或路径(若不存在创建它)。

第三种形式在脚本中应用方便,形式如下

       (
         flock -n 9 || exit 1
         # ... commands executed under lock ...
       ) 9>/var/lock/mylockfile

The mode used to open the file doesn‘t matter to flock; using > or >> allows the lockfile to be cre‐
       ated if it does not already exist, however, write permission is required; using < requires that  the
       file already exists but only read permission is required.

默认情况下,flock会阻塞等,直到获取锁。

flock(2)中描述:Locks  created  by  flock() are associated with an open file table entry.  This means that duplicate
       file descriptors (created by, for example, fork(2) or dup(2)) refer to the same lock, and this  lock
       may  be  modified  or  released  using  any of these descriptors.  Furthermore, the lock is released
       either by an explicit LOCK_UN operation on any of these duplicate  descriptors,  or  when  all  such
       descriptors have been closed.

应用

1 crontab运用flock防止重复执行

* * * * * (flock -xn ./test.lock -c "sh /root/test.sh") #-n 为非阻塞模式

2 机器down机自动启动或重启

可以在daemon开始的时候, 打开一个文件然后获取一个写锁. 守护脚本也打开文件并设置写锁, 然后阻塞, 一旦写锁获得成功, 则说明daemon已经挂了. 此时守护脚本重启daemon并放弃写锁.

flock -x ./test.lock -c "/usr/local/nginx/sbin/nginx" #去掉-n表示使用阻塞模式

运行中...

再次执行

flock -x ./test.lock -c "/usr/local/nginx/sbin/nginx" #去掉-n表示使用阻塞模式

阻塞中...

模拟down机

[[email protected] ~]# ps aux |grep "nginx"|grep"master"|grep -v "grep"|awk‘{print $2}‘|xargskill -9 

kill后阻塞的命令马上执行 新的进程PID立马产生。

时间: 2024-10-14 20:06:07

flock的相关文章

Linux文件锁学习-flock, lockf, fcntl

参考  linux中fcntl().lockf.flock的区别 这三个函数的作用都是给文件加锁,那它们有什么区别呢? 首先flock和fcntl是系统调用,而lockf是库函数.lockf实际上是fcntl的封装,所以lockf和fcntl的底层实现是一样的,对文件加锁的效果也是一样的.后面分析不同点时大多数情况是将fcntl和lockf放在一起的. 下面首先看每个函数的使用,从使用的方式和效果来看各个函数的区别. 1. flock l 函数原型 #include<sys/file.h> i

PHP编译时错误解决:Don&#39;t know how to define struct flock on this system, set --enable-opcache=no

编译PHP5.6.16时出现了这个错误: Don't know how to define struct flock on this system, set --enable-opcache=no 解决方法: ln -s /usr/local/mysql/lib/libmysqlclient.so /usr/lib/ ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18 PHP编译时错误解决:D

文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write

文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write close(关闭文件) 相关函数 open,fcntl,shutdown,unlink,fclose 表头文件 #include<unistd.h> 定义函数 int close(int fd); 函数说明 当使用完文件后若已不再需要则可使用close()关闭该文件,二close()会让数据写回磁盘,并释放该文件所占用的资源.参数fd为

每天进步一点点——Linux编程中的文件锁之flock

转载请说明出处:http://blog.csdn.net/cywosp/article/details/30083015 1. 场景概述 在多线程开发中,互斥锁可以用于对临界资源的保护,防止数据的不一致,这是最为普遍的使用方法.那在多进程中如何处理文件之间的同步呢?我们看看下面的图: 图中所示的是两个进程在无同步的情况下同时更新同一个文件的过程,其主要的操作是: 1. 从文件中读取序号. 2. 使用这个序号完成应用程序定义的任务. 3. 递增这个序号并将其写回文件中. 从图中可得知两个进程读取分

flock防止重复rsync

我使用crontab同步一个文件夹时,发现一个问题,我在crontab中设置的1分钟运行一次.但当那个文件夹的内容改变时.1分钟不一定能同步完,但这时第二个rsync进行又起来了. 这个就产生一个问题,二个rsync一起处理相同的文件,这样会出问题.如下 1 * * * * /usr/bin/rsync -avlR /data/files    172.16.xxx.xxx:/data 本来想写个脚本来解决,但太麻烦.所以用了个linux下的锁..呵呵,象下面这个. 1 * * * * floc

php使用flock堵塞写入文件和非堵塞写入文件

堵塞写入代码:(全部程序会等待上次程序运行结束才会运行,30秒会超时) <?php $file = fopen("test.txt","w+"); $t1 = microtime(TRUE); if (flock($file,LOCK_EX)) { sleep(10); fwrite($file,"Write something"); flock($file,LOCK_UN); echo "Ok locking file!&quo

Don&#39;t know how to define struct flock on this system, set --enable-opcach=no

解决方法一: 最后查看php官方文档解决. 在configure 里面加上   --with-libdir=lib64 解决方法二: 编辑/etc/ld.so.conf 根据系统,加入include /etc/ld.so.conf, 然后执行ldconfig,使其重新加载一次:(如果出错改为vi /etc/ld.so.conf  >> include /usr/local/libmcrytp/lib/) 错误说明 今天在centos 6.3 64位版本上安装PHP5.4.3时在./config

Linux文件锁flock

在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要锁操作来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock. flock,建议性锁,不具备强制性.一个进程使用flock将文件锁住,另一个进程可以直接操作正在被锁的文件,修改文件中的数据,原因在于flock只是用于检测文件是否被加锁,针对文件已经被加锁,另一个进程写入数据的情况,内核不会阻止这个进程的写入操作,也就是建议性锁的内核处理策略. flock主要三种操作类型: LOCK_SH,共享锁,多个进程可以

PHP使用flock实现文件加锁来防止多进程同时写入文件

lock在官方文档里的解释是:flock() 允许你执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是Windows).如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),请将可选的第三个参数设置为 TRUE.锁定操作也可以被 fclose() 释放(代码执行完毕时也会自动调用). 简单来说,就是对一个文件进行锁定操作,使得多进程访问该文件时受到限制,从而防止冲突.举个例子: <?php    $file = fopen("test.txt&