linux-flock文件锁之实际运用

vi test.sh

#! /bin/bash
echo "Hello World"
sleep 10

touch test.lock #随便命名

[[email protected] ~]# flock -xn ./test.lock -c "sh /root/test.sh"

运行中...

开启另外一个bash窗口运行

[[email protected] ~]# flock -xn ./test.lock -c "sh /root/test.sh"

前面未获取到锁直接返回 直到其他运行完毕 这个才开始运行

运用

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立马产生  欧啦

附加flock参数

-s,--shared:获取一个共享锁,在定向为某文件的FD上设置共享锁而未释放锁的时间内,其他进程试图在定向为此文件的FD上设置独占锁的请求失败,而其他进程试图在定向为此文件的FD上设置共享锁的请求会成功。
-x,-e,--exclusive:获取一个排它锁,或者称为写入锁,为默认项
-u,--unlock:手动释放锁,一般情况不必须,当FD关闭时,系统会自动解锁,此参数用于脚本命令一部分需要异步执行,一部分可以同步执行的情况。
-n,--nb, --nonblock:非阻塞模式,当获取锁失败时,返回1而不是等待
-w, --wait, --timeout seconds:设置阻塞超时,当超过设置的秒数时,退出阻塞模式,返回1,并继续执行后面的语句
-o, --close:表示当执行command前关闭设置锁的FD,以使command的子进程不保持锁。
-c, --command command:在shell中执行其后的语句

时间: 2024-10-11 02:53:17

linux-flock文件锁之实际运用的相关文章

小何讲Linux: 文件锁及其实例

1.  文件锁基本概念 Linux中软件.硬件资源都是文件(一切皆文件),文件在多用户环境中是可共享的. 文件锁是用于解决资源的共享使用的一种机制:当多个用户需要共享一个文件时,Linux通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态. 文件锁包括建议性锁和强制性锁: 建议性锁:要求每个使用上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁.在一般情况下,内核和系统都不使用建议性锁,它们依靠程序员遵守这个规定. 强制性锁:是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将

(转)linux用文件锁实现保证一个程序只能启动一个进程

#include <stdio.h> #include <unistd.h>#include <fcntl.h>#include <errno.h>int main(int argc,char* argv[]){ int fd; int lock_result; struct flock lock; char * pFileName = "tmp.lck"; fd = open(pFileName,O_RDWR); if(fd<0)

linux使用flock解决crontab任务冲突

Linux的crontab最小的间隔是每分钟执行一次,但是如果在这一分钟之内,之前的命令并没有执行完成呢?这样就会产生冲突.接下来我介绍一个解决冲突的办法,那就是linux的flock文件锁. 格式: flock [-sxun][-w #] fd# flock [-sxon][-w #] file [-c] command 参数是: -s, --shared: 获得一个共享锁 -x, --exclusive: 获得一个独占锁 -u, --unlock: 移除一个锁,通常是不需要的,脚本执行完会自

linux使用共享内存通信的进程同步退出问题

两个甚至多个进程使用共享内存(shm)通信,总遇到同步问题.这里的“同步问题”不是说进程读写同步问题,这个用信号量就好了.这里的同步问题说的是同步退出问题,到底谁先退出,怎么知道对方退出了.举个例子:进程负责读写数据库A,进程B负责处理数据.那么进程A得比进程B晚退出才行,因为要保存进程B处理完的数据.可是A不知道B什么时候退出啊.A.B是无关联的进程,也不知道对方的pid.它们唯一的关联就是读写同一块共享内存.正常情况下,进程B在共享内存中写个标识:进程A你可以退出了,也是可以的.不过进程B可

linux程序设计——文件锁定(第七章)

7.2 文件锁定 这篇为linux的文件锁定,代码在文件锁定代码下载.文件锁定是多用户.多任务操作系统中一个非常重要的组成部分.程序经常需要共享数据,而这通常是通过文件来实现的.因此,对于这些程序来说,建立某种控制文件的方式就非常重要.只有这样,文件才可以通过一种安全的方式更新,或者说,当一个程序正在对文件进行写操作时,文件就会进入一个暂时状态,在这个状态下,如果另外一个程序尝试读这个文件,它就会自动停下来等待这个状态的结束. linux提供了多种特性来实现文件锁定,其中最简单的方式就是以原子操

flock,lockf,flockfile,funlockfile

flock和lockf 从底层的实现来说,Linux的文件锁主要有两种:flock和lockf.需要额外对lockf说明的是,它只是fcntl系统调用的一个封装.从使用角度讲,lockf或fcntl实现了更细粒度文件锁,即:记录锁.我们可以使用lockf或fcntl对文件的部分字节上锁,而flock只能对整个文件加锁.这两种文件锁是从历史上不同的标准中起源的,flock来自BSD而lockf来自POSIX,所以lockf或fcntl实现的锁在类型上又叫做POSIX锁. 除了这个区别外,fcntl

一些函数

1,采集网页用的curl 系列函数. 可以模拟登陆,模拟ip,抓取网页,通过抓取的网页来提取数据. 2,flock 文件锁. ( LOCK_SH取得共享锁定(读取的程序). LOCK_EX 取得独占锁定(写入的程序. LOCK_UN 释放锁定(无论共享或独占) ) 用在模拟进程锁方面的. 3,fsockopen 模拟请求感觉跟curl类似,但是没有用过. ---进程之类的只能在liunx下使用---- 4,pcntl php的进程控制. 用了pcntl_fork 产生子进程.了解不多. 5,po

acl 网络通信与服务器框架库示例列表

跨平台网络通信及服务器框架库 --- "acl" 项目里有大量的测试及应用示例,主要有三个示例集合,如下: 1.acl/samples:该目录下的例子主要是基于 lib_acl 及 lib_protocol 两个库的例子-    1.1 acl: 打印当前 acl 库版本号程序-    1.2 aio/client: 非阻塞 io 客户端-    1.3 aio/server: 非阻塞 io 服务器-    1.4 base64: base64 编/解码程序-    1.5 btree

PHP文件锁定写入实例分享

PHP文件锁定写入实例解析. 原文地址:http://www.jbxue.com/article/23118.html PHP文件写入方法,以应对多线程写入,具体代码: function file_write($file_name, $text, $mode='a', $timeout=30){ $handle = fopen($file_name, $mode); while($timeout>0){ if ( flock($handle, LOCK_EX) ) { // 排它性的锁定 $ti

php爬虫抓取信息及反爬虫相关

58爬虫了百姓,赶集和58互爬,最后各种信息相同,都是爬虫后的数据库调用,潜规则啊,几家独大还暗中各种攻击,赶驴网的幽默事例我不想多评价.这个时代是砸.钱*养.钱的时代,各种姚晨杨幂葛优,各种地铁公车广告,各种卫视广告,铺天盖地~~~ 来谈php爬虫抓取信息~~ php爬虫首推Curl函数了,先来认识下它. 0x01.curl扩展的安装: 1.确保php子文件夹ext里面有php_curl.dll(一般都有的,一般配置时候会设置环境变量的) 2.将php.ini里面的;extension=php