linux文件锁
1. linux shell中的加锁
flock的选项-n等同于--nonblock,表示非阻塞模式。man flock可以看到详细说明:
Fail (with an exit code of 1) rather than wait if the lock cannot be immediately acquired.
翻译过来就是,若不能立即获得文件锁,就直接出错返回1而不是继续等待(默认flock是会继续等待直到获得文件锁)。
3就是fd(即文件描述符)。
文件锁只是用于防止多个程序同时访问一个文件的冲突情况。
Shell自动分配fd的话,原本就不会使用已被占用的fd,而是自动递增。
这里显式指定fd为3(3<>mylockfile),是为了flock有操作的对象。只有unlock后文件才能被其他程序访问,这样就可以保证文件访问不冲突。
2. 定Linux查看文件被锁定状态的方法linux查看文件锁
Linux系统上文件被锁定时,多是为了防止多个用户同时修改同一个文件,给操作系统带来信心,维护系统稳定性。因此,开发者特别关注Linux系统上查看文件是否被锁定的脚本功能,一般可以通过以下方法定位这一问题:
1.使用’fuser’命令查看每一个文件的状态,以及它的文件所属的用户,以及正在运行的程序ID。我们可以使用下面的命令查看目标文件情况:
`fuser filename`
2.除了使用’fuser’命令外,我们还可以使用’lsof’命令来查看文件是否被谁锁定。我们可以使用下面的命令查看情况:
`lsof filename`
3.我们也可以使用’ps’命令来查询哪个进程正在操作文件,可以使用以下命令查看:
`ps -ef |grep filename`
但是这些命令并不一定能准确给我们显示文件是否被锁定,这时就需要我们通过’strace’跟踪工具来检查该文件有没有被打开,以及被谁打开,以及打开的模式。
可以使用以下’strace’命令来查看:
` strace -C -f -e trace=open `
上述命令会显示程序试图访问文件的状态,以及文件正在被那个程序打开。通过观察输出结果,可以得出文件被锁定的信息。
Linux上查看文件是否被锁定的方法就介绍到这里,大家也可以使用上述代码进行检查,将上述脚本放入自动化脚本或者监控系统中,进行文件是否正常使用检查。通过以上方法,任何用户都可以查看文件是否被锁定,以及被锁定是否符合一定条件,保护系统读写文件的正常性。
3. linux 文件锁,当一个进程对一个文件上了写锁以后,因异常退出而没有释放锁,其他进程还能读被锁住的区段
可以读取,但是不能写入了:
chattr +i /etc/passwd
就不能在创建用户了
除非解锁:
chattr-i /etc/passwd
4. linux中fcntl()函数的使用
前面的这5个基本函数实现了文件的打开、读写等基本操作,这一节将讨论的是,在文 件已经共享的情况下如何操作,也就是当多个用户共同使用、操作一个文件的情况,这时,Linux 通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态。
文件锁包括建议性锁和强制性锁。
建议性锁要求每个上锁文件的进程都要检查是否有锁存,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁。强制性锁是由内 核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何文件对其进行读写操作。采用强制性锁对性能的影响很大,每次读写操作都必须检查是否有锁存在。
在 Linux 中,实现文件上锁的函数有lock和fcntl,其中flock用于对文件施加建议性锁,而fcntl不仅可以施加建议性锁,还可以施加强制锁。同时,fcntl还能对文件的某一记录进行上锁,也就是记录锁。
记录锁又可分为读取锁和写入锁,其中读取锁又称为共享锁,它能够使多个进程都能在文件的同一部分建立读取锁。而写入锁又称为排斥锁,在任何时刻只能有一个进程在文件的某个部分上建立写入锁。当然,在文件的同一部分不能同时建立读取锁和写入锁。