web-dev-qa-db-ja.com

Linux flock(1)コマンドに相当するMac OS X

ファイルロックを管理するflockコマンドはMacOS Xにありますか?

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

27
png

ここにクロスプラットフォームのflockコマンドがあります:

https://github.com/discoteq/flock

私はそれをテストしました、そしてそれはutil-linux群れのドロップイン代替品としてOSXでうまく機能します。

15
sneak

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

flockコマンドがOSXに存在するとは思わないが、BSDには存在するため、OSXへの移植がかなり簡単になるはずです。

利用可能な最も近いものはshlockコマンド( manページ )ですが、flockほど堅牢でも安全でもありません。

最善の策は、LinuxまたはBSDバージョンのflockをOSXに移植することを検討することかもしれません。

3
mttrb

OSXにはflockコマンドはありません。 flockシステムコールを使用してそのリソースへのアクセスを管理するプログラムとロック可能なリソースを共有できるシェルスクリプトが必要な場合は、BSDソースを自分でコンパイルするか、次のように記述して、そのようなプログラムを作成する必要があります。独自の同等のプログラム(おそらくPerlまたはRuby、または高レベルのシステムインターフェイスの一部としてflockを公開するその他の言語)。

ただし、必要なのがシェルスクリプトからのファイルへのアクセスを同期する方法だけであり、flockを使用して同期しようとする他のプログラムがまだ作成されていない場合は、lockfileコマンド。これは、procmailパッケージに付属しています。 OSXはprocmailで出荷されていました。もはや機能しませんが、たとえば、 自作

2
Mark Reed

完全を期すために、いくつかの小さな変更を加えて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
Ahti

たぶんlockfileも使用できます。

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

1
jayeff

flockコマンドラインユーティリティまたはflock機能をお探しですか?

flock(1)はOSXでは使用できません。flock(2)(ファイルロック用のC関数)、 ただし

flock(1)を使用して簡単なコマンドラインflock(2)ユーティリティを作成するのは簡単です。

1