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

Macos Mac OS X相当于Linux flock(1)命令,macos,shell,file-locking,Macos,Shell,File Locking,Mac OS X上有管理文件锁定的flock命令吗 我不认为OSX上存在flock命令,但它确实存在于BSD上,这将使移植到OSX相当容易 可用的最接近的命令是shlock命令(),但它不如flock那么健壮和安全 您最好考虑将Linux或BSD版本的flock移植到OS X。您是在寻找flock命令行实用程序还是flock功能 flock(1)在OS X上不可用。flock(2)(用于文件锁定的C函数) 使用flock(2)编写一个简单的命令行flock(1)实用程序应该很简单。由于文件锁定的

Mac OS X上有管理文件锁定的flock命令吗


我不认为OSX上存在
flock
命令,但它确实存在于BSD上,这将使移植到OSX相当容易

可用的最接近的命令是
shlock
命令(),但它不如
flock
那么健壮和安全


您最好考虑将Linux或BSD版本的
flock
移植到OS X。

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

flock(1)
在OS X上不可用。
flock(2)
(用于文件锁定的C函数)


使用
flock(2)
编写一个简单的命令行
flock(1)
实用程序应该很简单。

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

因此,如果您实现了一个填充某些内容的shell命令,那么一旦锁定命令退出并且shell脚本移动到下一个命令,持有锁的描述符就会消失,因此不会保留锁

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

Perl一行程序:

perl-MFcntl=:flock-e'$|=1$f=位移;打印(“开始\n”);开放式(FH,$f)|模具($!);鸥群(FH、LOCK_EX);打印(“获得锁定\n”);系统(join(“,@ARGV));打印(“解锁”);鸥群(FH,LOCK_UN);'/tmp/longrung.sh/tmp/longrung.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); 
#/usr/bin/perl
#模拟linux flock命令行实用程序
#
使用警告;
严格使用;
使用Fcntl qw(:flock);
#行缓冲区
$|=1;
我的$file=shift;
my$cmd=join(“,@ARGV”);
如果(!$file |!$cmd){
模具(“用法:$0[…]\n”);
}
打印(“尝试锁定文件:$file\n”);
打开(FH,$file)| |模具($!);
鸥群(FH,锁定前)| |死亡($!);
打印(“获得锁定\n”);
打印(“正在运行的命令:$cmd\n”);
系统(cmd);
打印(“解锁文件:$file\n”);
鸥群(FH、LOCK_UN);

为了完整起见,您可以对OSX编译flock(2),只需做一些小改动,我还没有运行任何测试,但基本功能正常

您可以从中获取源代码。然后,您需要替换一些OSX上不可用的字符串函数调用,这样就可以开始了


这里:是我修改过的flock.c版本2.22.1,但是你仍然需要其他的头文件源。

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


但是,如果您所需要的只是一种从shellscript同步访问文件的方法,并且您还没有编写其他程序来尝试使用
flock
,那么您可以使用
lockfile
命令,该命令随
procmail
包一起提供。OSX过去与procmail一起提供;不再安装,但您可以通过安装,例如:

此处有一个跨平台的flock命令:


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

linux不是flock(2)的一个简单包装器。我理解得对吗?只有在进程运行时才会保持锁定。因此,在flock(2)周围使用一个简单的包装器可以在锁运行时保持锁只运行一段时间。在脚本中,锁将在调用下一个命令之前释放,对吗?@jboi-flock(1)命令要么接受shell命令(在持有锁时运行),要么接受应锁定的文件描述符的编号-在后一种情况下,文件描述符在调用方中打开(如果它是一个shell脚本,使用
exec 9>$LOCKFILE
或类似工具)并在flock命令退出后保持打开状态。至于@tchrist声称您无法编写shell级别的flock,我相信(几乎)他关于Perl的任何说法,但在这一点上他错了。flock命令运行锁定的命令(如果传递了文件名)或者被传递一个文件描述符编号-它有效!@tchrist,
flock(1)
即使在Linux上也不是内置的shell,因此这显然是不真实的。相反,将锁附加到文件描述符也适用于该FD,即使在进程之间,因此它也可以修改父实例。@Yan将来,您可能不应该对其他人的答案进行代码更改。请随意以c提交您建议的编辑注意,让作者打电话询问他或她是否想更改答案(10次中有9次,如果是错误,他们会纠正)。请随时编辑答案,以获得清晰或格式方面的实质性更改,但不要更改答案本身。请注意,此Perl模拟非常不完整-它只支持表单
flock FILE命令…
,而不支持
flock FD
表单(也不支持任何flock(1)选项).声称成功但实际上没有采取行动(表现为noop)比明确失败更好吗?啊——因为
-x
是该实现中的默认值。好的,读了手册页后更有意义。:)我提交了一个功能请求,在这里接受
-x
作为禁止操作-感谢向discoteq/flock提交票据,我很感激@您可以更新您的响应,一位慷慨的贡献者最近添加了
-x
标志以及长选项。您应该看看lockfile命令(随procmail提供,OSX上的标准)<代码>锁定文件:未找到命令