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);
このコマンドが OS X に存在するとは思いませんflock
が、BSD には存在するため、OS X への移植はかなり簡単です。
利用可能な最も近いのはshlock
コマンド ( man ページ) ですが、 ほど堅牢でも安全でもありませんflock
。
flock
Linux または BSD バージョンのいずれかを OS Xに移植することを検討することをお勧めします。
flock
OS X にはコマンドがありません。システムコールを使用してそのリソースへのアクセスを管理するプログラムとロック可能なリソースを共有できるシェルスクリプトが必要な場合は、そのflock
ようなプログラムを作成する必要があります-BSDソースを自分でコンパイルするか、独自の同等のプログラムを作成します(おそらくPerl、Ruby、またはflock
高レベルのシステム インターフェイスの一部として公開されるその他の言語で)。
ただし、シェルスクリプトからファイルへのアクセスを同期する方法だけが必要であり、他のプログラムでそれを実行しようとしてまだ作成されていない場合は、パッケージに付属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)
することは簡単です。
ファイル ロックの仕組みが原因で、シェル プログラミングで使用するシェルレベルのflock (1) コマンドを作成することはできません。ロックはディスクリプタにあり、i ノードまたはディレクトリ エントリにはありません。
したがって、何かを群がらせるシェル コマンドを実装すると、ロック コマンドが終了し、シェル スクリプトが次のコマンドに移るとすぐに、ロックを保持していた記述子が消失するため、ロックは保持されません。
これを実装する唯一の方法は、シェルの組み込みとしてです。または、実際にflock (2) を直接サポートするプログラミング言語 (Perl など)で書き直す必要があります。