Mac OS X相当于Linux flock(1)命令

时间:2012-05-10 02:10:43

标签: macos shell file-locking

Mac OS X上是否有用于管理文件锁定的flock命令?

http://linux.die.net/man/1/flock

9 个答案:

答案 0 :(得分:12)

这里有一个跨平台的flock命令:

https://github.com/discoteq/flock

我已经对它进行了测试,它在OSX上运行良好,可以替代util-linux flock。

答案 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也可以使用。

http://linux.die.net/man/1/lockfile

答案 4 :(得分:2)

OS X上没有flock命令,没有。如果您需要一个可以与使用flock系统调用来管理对该资源的访问的程序共享可锁定资源的shell脚本,则必须创建这样的程序 - 通过自己编译BSD源,或者编写自己的等效程序(可能是Perl或Ruby或其他语言,它将flock作为其高级系统接口的一部分公开)。

但是,如果您只需要一种方法来同步对来自shellcript的文件的访问,并且您没有使用flock尝试这样做的其他程序,则可以使用{{ 1}}命令,附带lockfile包。 OS X过去常带procmail;它不再存在,但您可以通过例如Homebrew

答案 5 :(得分:1)

您是在寻找flock命令行实用程序还是flock该功能?

OS X上无法使用

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)

您可以通过 conda 安装 flock,例如:

conda create --name flock flock

conda install flock

要安装 conda,请参阅 here

答案 8 :(得分:-5)

由于文件锁定的工作方式,您无法编写shell级别的 flock (1)命令以用于shell编程。锁定在描述符上,而不在inode或目录条目上。

因此,如果你实现了一个fl命令的shell命令,只要lock命令退出并且shell脚本移动到下一个命令,持有锁的描述符就会消失,因此没有锁定保留。

实现这个的唯一方法是作为shell内置。或者,您必须使用直接实际支持 flock (2)的编程语言重写,例如Perl。