2012-05-10 14 views

答えて

2

私はflockコマンドは、OS X上に存在することを信じていませんが、それが利用可能であることをOS Xにポートにそれが合理的に簡単

最も近いをするべきであるBSD上に存在しませんshlockコマンド(man page)ですが、flockほど堅牢ではありません。

あなたの最善の策は、

1

あなたはflockコマンドラインユーティリティまたはflock機能を探しているOS XにflockのLinuxやBSDバージョンのいずれかの移植を見てすることであってもよいですか?

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

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

-5

flock flock(1)コマンドをシェルプログラミングで使用することはできません。なぜなら、ファイルロックの働きがあるからです。ロックはディスクリプタ上にあり、iノードまたはディレクトリエントリ上ではありません。

したがって、何かをまとめるシェルコマンドを実装すると、ロックコマンドが終了してシェルスクリプトが次のコマンドに移動すると、ロックを保持していたディスクリプタが消えてロックが保持されなくなります。

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

+0

Linuxの[flock(1)](http://linux.die.net/man/1/flock)は、flock(2)の周りの小さなラッパーではありません。 – Gilles

+0

私はそれを正しく理解していますか?ロックはプロセスが実行されている間だけ保持されます。したがって、flock(2)の周りの単純なラッパーは、ロックが実行されている間だけロックを保持します。スクリプトでは、次のコマンドが呼び出される前にロックが解除されます。 – jboi

+2

@jboi - flock(1)コマンドは、シェルコマンド(ロックを保持している間に実行される)またはロックされるファイル記述子の番号を取る。後者の場合、ファイル記述子は呼び出し元で開かれる'' exec 9> $ LOCKFILE''などを使ったシェルスクリプトです)、flockコマンドが終了しても開いたままになります。 @ tchristの主張では、シェルレベルの群れを書くことはできませんが、Perlについては(ほぼ)何でも言えると思いますが、これは間違っています。 flockコマンドはロックされたコマンドを実行します(ファイル名が渡された場合)。または、ファイル記述子番号が渡されます。 –

10

Perlのワンライナー:

#!/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将来、他の人の回答にコードを変更しないでください。提案された編集をコメントとして提出して、著者が自分の答えを変更したいかどうかについて電話する(10のうち9回、間違えた場合は修正する)。大幅な変更があった場合は、明快さや書式を自由に変更して編集してください。ただし、回答自体は変更しないでください。 – Rob

+1

このPerlエミュレーションは非常に不完全で、 '' flock FD''形式ではなく、 '' flock FILE COMMANDS ... ''という形式だけをサポートしています(どちらもflock(1)オプションをサポートしていません)。 –

1

ただ、完全酒のために、あなたは(2)OSXのためにいくつかのマイナーな変更で、私は群れをコンパイルすることができますスクリプトとして

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

テストは実行しませんが、基本的な機能は動作します。

ftp://ftp.kernel.org//pub/linux/utils/util-linuxから情報源を入手できます。その後、OSXで利用できない文字列関数への呼び出しを置き換える必要があります。

ここで:https://gist.github.com/Ahti/4962822は私のバージョン2.22.1のflock.cですが、ヘッダーの他のソースはまだ必要です。

1

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

しかし、flockでこれを行うように書かれた他のプログラムを持っていない場合は、lockfileコマンドを使うことができます。これは、シェルスクリプトからのファイルへのアクセスを同期させる方法ですprocmailパッケージを使用してください。 OS Xはprocmailで出荷されていました。それはもはやありませんが、あなたはそれをインストールすることができます。 Homebrew

+0

あなたはlockfileコマンド(procmail、OS Xの標準に付属しています)を参照する必要があります。エルキャピタン(10.11.6)ではロックファイル:コマンドが見つかりませんでしたので、**標準ではありません**。 – Sukima

+0

@sukimaさん、ありがとうございます。修正されました。 –

8

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

https://github.com/discoteq/flock

私はそれをテストしてきたし、それがドロップイン置換のutil-linuxの群れのためとして、OSX上でうまく動作します。

+0

どのように成功したと主張していますが、実際には何もしないように行動しないことは、明示的に失敗するよりも優れていますか? –

+0

Ahh - その実装では '-x'がデフォルトです。さて、manページを読んだほうが意味があります。 :) –

+0

私はここにno-opとして '-x'を受け入れる機能リクエストを提出しました - https://github.com/discoteq/flock/issues/9 – studgeek

関連する問題