1.前言
Shell中似乎不存在通用的文件互斥访问机制。Linux下有flock命令,但Solaris没有。
通过一番调查,笔者找到了一个简单易行的方法来弥补Shell的这一不足。
2.原理
原理比较简单。主要是以下两个命令的配合使用:
命令A:
set -o noclobber |
命令B:
echo XXX > filename.lock |
命令A启用Shell的“禁用重定向覆盖”功能,命令B是重定向操作。
filename.lock不存在时,不考虑访问权限的限制,命令B总是能正常结束。
filename.lock已经存在时,使用了命令A之后的命令B将会异常结束。而不使用命令A时命令B会将原来的filename.lock覆盖掉然后正常结束。
要达到互斥的效果,必须具备的条件是,命令B的执行过程中,从判断文件是否存在到生成文件的过程是原子的(CPU不能被其他进程抢占)。否则即使有判断文件是否存在的功能,也不能阻止以下的情况发生。
处理顺序 |
进程A |
进程B |
文件状态 |
1 |
判断文件是否存在 |
— |
不存在 |
2 |
—(CPU被抢占) |
判断文件是否存在 |
不存在 |
3 |
生成文件 |
—(CPU被抢占) |
存在(由A生成) |
4 |
— |
生成文件 |
存在(由B生成,覆盖A生成的) |