38

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

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

4

8 に答える 8

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); 
于 2012-11-12T12:42:17.037 に答える
4

このコマンドが OS X に存在するとは思いませんflockが、BSD には存在するため、OS X への移植はかなり簡単です。

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

flockLinux または BSD バージョンのいずれかを OS Xに移植することを検討することをお勧めします。

于 2012-05-10T02:32:32.927 に答える
2

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

ただし、シェルスクリプトからファイルへのアクセスを同期する方法だけが必要であり、他のプログラムでそれを実行しようとしてまだ作成されていない場合は、パッケージに付属flockのコマンドを使用できます。OS X は以前は同梱されていました。もはやそうではありませんが、たとえばHomebrewを介してインストールできます。lockfileprocmailprocmail

于 2014-10-28T17:13:26.883 に答える
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 ですが、ヘッダー用の他のソースが必要です。

于 2013-02-15T19:38:28.730 に答える
-1

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

flock(1)は OS X では使用できませんflock(2)(ファイル ロック用の C 関数) です、 .

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

于 2012-05-10T02:57:21.950 に答える
-6

ファイル ロックの仕組みが原因で、シェル プログラミングで使用するシェルレベルのflock (1) コマンドを作成することはできません。ロックはディスクリプタにあり、i ノードまたはディレクトリ エントリにはありません。

したがって、何かを群がらせるシェル コマンドを実装すると、ロック コマンドが終了し、シェル スクリプトが次のコマンドに移るとすぐに、ロックを保持していた記述子が消失するため、ロックは保持されません。

これを実装する唯一の方法は、シェルの組み込みとしてです。または、実際にflock (2) を直接サポートするプログラミング言語 (Perl など)で書き直す必要があります。

于 2012-05-13T15:07:24.993 に答える