Mac OS X中与Linux flock(1)命令相当的命令是什么?

40
8个回答

25

声称成功但实际上未采取行动(表现为无操作)比明确失败更好吗? - Charles Duffy
2
啊 - 因为在那个实现中-x是默认的。好的,在阅读手册后更有意义了。 :) - Charles Duffy
我在这里提交了一个功能请求,希望能够接受“-x”作为无操作 - https://github.com/discoteq/flock/issues/9 - studgeek
感谢您向Discoteq/Flock提交工单,我非常感激! - Joseph Holsten
@sneak,你可以更新你的回复了,一位慷慨的贡献者最近添加了“-x”标志以及长选项。 - Joseph Holsten
不幸的是,自添加“-x”选项以来已经过去了两年,但迄今为止还没有发布新版本。这意味着至少使用brew你得到的是一个过时的版本。 - megamorf

10

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); 

2
@Yan 未来您最好不要对他人的答案进行代码更改。请将您建议的编辑作为评论提交,让作者决定是否想要更改他们的答案(如果是错误,他们会修复)。您可以随意编辑答案以进行重大更改以提高清晰度或格式,但请不要更改答案本身。 - Rob
1
请注意,此Perl仿真非常不完整 - 它仅支持形式“flock FILE COMMANDS...”,而不支持“flock FD”形式(它也不支持任何flock(1)选项)。 - Alex Dupuy

6
我不相信在OS X上存在flock命令,但它在BSD上存在,这使得将其移植到OS X应该相对容易。
最接近的替代品是shlock命令(man page),但它不像flock那样健壮或安全。
你最好考虑将Linux或BSD版本的flock移植到OS X。

3
macOS没有内置命令,但是您可以通过Homebrewbrew install flock)安装一个flock命令。如果您需要一个可以与使用flock系统调用来管理对该资源的访问的程序共享锁定资源的shell脚本,则这可能是最好的方式。

如果您只是尝试同步访问某些内容并且不需要与已经使用flock的东西兼容,则可以另外安装procmail并改用lockfile


2
你应该查看lockfile命令(随procmail一起提供,在OS X上是标准的)。在El Capitan(10.11.6)上出现“lockfile:command not found”,因此它不是标准的 - Sukima

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文件,但您仍需要其他头文件的源代码。


1

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

conda create --name flock flock

或者

conda install flock

安装conda,请参见此处

-1
你是在寻找命令行实用程序flock还是功能flock
在OS X上,flock(1)不可用。文件锁定的C函数flock(2)然而是
使用flock(2)编写一个简单的命令行flock(1)实用程序应该很容易。

8
使用 flock(2) 编写一个简单的命令行 flock(1) 工具应该很容易。它是如此简单,以至于你会很慷慨地与非 C 开发人员分享这个工具吗? - Mayeu

-6

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

因此,如果您实现了一个锁定某些内容的shell命令,当锁定命令退出并且shell脚本继续执行下一个命令时,持有锁的描述符将消失,因此没有保留锁。

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


Linux的 flock(1) 不是对flock(2)的简单封装。 - Gilles 'SO- stop being evil'
我是否理解正确?只有在进程运行时才保持锁定。因此,对flock(2)的简单包装器将仅在其运行时保持锁定。在脚本中,锁定将在调用下一个命令之前释放,是吗? - jboi
2
@jboi - flock(1) 命令接受一个 shell 命令(在持有锁的情况下运行),或者一个需要被锁定的文件描述符号码。对于后者,文件描述符会在调用程序中被打开(如果它是一个 shell 脚本,则使用“exec 9>$LOCKFILE”类似的方式)。在 flock 命令退出之后,文件描述符保持打开状态。至于 @tchrist 的说法 —— 无法编写一个 shell 级别的 flock,我几乎相信他关于 Perl 的任何说法,但在这一点上他是错的。flock 命令可以运行锁定的命令(如果传递了文件名),或者接收一个文件描述符号码 - 它完全奏效! - Alex Dupuy
@tchrist,即使在Linux上,flock(1)也不是shell内置命令,因此这显然是不正确的。相反,将锁定附加到文件描述符会应用于该FD,即使跨进程,因此它也能够修改父实例。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接