Perl一行代码:
perl -MFcntl=:flock -e '$|=1; $f=shift; print("starting\n"); open(FH,$f) || die($!); flock(FH,LOCK_EX); print("got lock\n"); system(join(" ",@ARGV)); print("unlocking\n"); flock(FH,LOCK_UN); ' /tmp/longrunning.sh /tmp/longrunning.sh
作为脚本:
#!/usr/bin/perl
# emulate linux flock command line utility
#
use warnings;
use strict;
use Fcntl qw(:flock);
# line buffer
$|=1;
my $file = shift;
my $cmd = join(" ",@ARGV);
if(!$file || !$cmd) {
die("usage: $0 <file> <command> [ <command args>... ]\n");
}
print("atempting to lock file: $file\n");
open(FH,$file) || die($!);
flock(FH,LOCK_EX) || die($!);
print("got lock\n");
print("running command: $cmd\n");
system($cmd);
print("unlocking file: $file\n");
flock(FH,LOCK_UN);
flock
命令,但它在BSD上存在,这使得将其移植到OS X应该相对容易。shlock
命令(man page),但它不像flock
那样健壮或安全。flock
移植到OS X。brew install flock
)安装一个flock命令。如果您需要一个可以与使用flock系统调用来管理对该资源的访问的程序共享锁定资源的shell脚本,则这可能是最好的方式。
如果您只是尝试同步访问某些内容并且不需要与已经使用flock的东西兼容,则可以另外安装procmail
并改用lockfile
。
仅为完整起见,您可以通过进行一些小的更改在OSX上编译flock(2),我没有运行任何测试,但基本功能可用。
您可以从ftp://ftp.kernel.org//pub/linux/utils/util-linux获取源代码。然后,您需要替换一些在OSX上不可用的字符串函数调用,然后就可以开始了。
这里:https://gist.github.com/Ahti/4962822 是我修改过的版本2.22.1的flock.c文件,但您仍需要其他头文件的源代码。
flock
还是功能flock
?flock(1)
不可用。文件锁定的C函数flock(2)
然而是。flock(2)
编写一个简单的命令行flock(1)
实用程序应该很容易。由于文件锁定的工作方式,您无法编写用于Shell编程的shell级别的flock(1)命令。锁定在描述符上,而不是在inode或目录条目上。
因此,如果您实现了一个锁定某些内容的shell命令,当锁定命令退出并且shell脚本继续执行下一个命令时,持有锁的描述符将消失,因此没有保留锁。
唯一的实现方法是作为shell内置命令。或者,您必须重写为实际支持flock(2)的编程语言,例如Perl。
flock(1)
也不是shell内置命令,因此这显然是不正确的。相反,将锁定附加到文件描述符会应用于该FD,即使跨进程,因此它也能够修改父实例。 - Charles Duffy
-x
是默认的。好的,在阅读手册后更有意义了。 :) - Charles Duffy