Mac OS X 上是否有管理文件锁定的flock 命令?
8 回答
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
命令存在于 OS X 上,但它确实存在于 BSD 上,这应该可以相当容易地移植到 OS X。
最接近可用的是shlock
命令(手册页),但它不如flock
.
您最好的选择可能是考虑将 Linux 或 BSD 版本移植flock
到 OS X。
flock
OS X 上没有命令,没有。如果您需要一个可以与使用系统调用来管理对该资源的访问的程序共享可锁定资源的 shell 脚本flock
,您将必须创建这样的程序 - 通过自己编译 BSD 源,或编写自己的等效程序(也许在 Perl 或 Ruby 或flock
作为其高级系统接口的一部分公开的其他语言中)。
但是,如果您只需要一种从shellscript同步访问文件的方法,并且您没有已经编写的其他程序尝试flock
使用. OS X 曾经附带; 它不再这样做,但您可以通过例如Homebrew安装它。lockfile
procmail
procmail
只是为了完整起见,您可以为 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)
在 OS X 上不可用。flock(2)
(用于文件锁定的 C 函数),但是.
编写一个简单的命令行flock(1)
实用程序flock(2)
应该是微不足道的。
由于文件锁定的工作方式,您无法编写用于 shell 编程的 shell 级别的flock (1) 命令。锁在描述符上,而不是在 inode 或目录条目上。
因此,如果您执行一个锁定某物的 shell 命令,一旦锁定命令退出并且 shell 脚本继续执行下一个命令,持有锁定的描述符就会消失,因此不会保留任何锁定。
实现这一点的唯一方法是作为 shell 内置。或者,您必须使用实际上直接支持flock (2) 的编程语言进行重写,例如Perl。