Mac OS X上是否有用于管理文件锁定的flock命令?
答案 0 :(得分:12)
答案 1 :(得分:10)
Perl one-liner:
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);
答案 2 :(得分:3)
我不相信OS X上存在flock
命令,但它确实存在于BSD上,这样可以很容易地将其移植到OS X.
最接近的是shlock
命令(man page),但它不如flock
强大或安全。
您最好的选择是将Linux或BSD版本的flock
移植到OS X.
答案 3 :(得分:2)
也许lockfile
也可以使用。
答案 4 :(得分:2)
OS X上没有flock
命令,没有。如果您需要一个可以与使用flock
系统调用来管理对该资源的访问的程序共享可锁定资源的shell脚本,则必须创建这样的程序 - 通过自己编译BSD源,或者编写自己的等效程序(可能是Perl或Ruby或其他语言,它将flock
作为其高级系统接口的一部分公开)。
但是,如果您只需要一种方法来同步对来自shellcript的文件的访问,并且您没有使用flock
尝试这样做的其他程序,则可以使用{{ 1}}命令,附带lockfile
包。 OS X过去常带procmail
;它不再存在,但您可以通过例如Homebrew
答案 5 :(得分:1)
您是在寻找flock
命令行实用程序还是flock
该功能?
flock(1)
。flock(2)
(用于文件锁定的C函数),however is。
使用flock(1)
编写一个简单的命令行flock(2)
实用程序应该是微不足道的。
答案 6 :(得分:1)
为了完整起见,您可以为OSX编译flock(2)并进行一些小的更改,我没有运行任何测试,但基本功能有效。
您可以从ftp://ftp.kernel.org//pub/linux/utils/util-linux获取来源。然后,您需要将一些调用替换为OSX上不可用的字符串函数,并且您很高兴。
这里:https://gist.github.com/Ahti/4962822是我修改过的版本2.22.1的flock.c,但你仍需要其他的标题源。
答案 7 :(得分:0)
答案 8 :(得分:-5)
由于文件锁定的工作方式,您无法编写shell级别的 flock (1)命令以用于shell编程。锁定在描述符上,而不在inode或目录条目上。
因此,如果你实现了一个fl命令的shell命令,只要lock命令退出并且shell脚本移动到下一个命令,持有锁的描述符就会消失,因此没有锁定保留。
实现这个的唯一方法是作为shell内置。或者,您必须使用直接实际支持 flock (2)的编程语言重写,例如Perl。