Mac OS X эквивалент команды Linux flock (1)

Есть ли в Mac OS X команда flock, которая управляет блокировкой файлов?

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

Ответы на вопрос(8)

lockfile может быть использован также.

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

flock команда на OS X, нет. Если вам нужен сценарий оболочки, который может совместно использовать блокируемый ресурс с программами, которые используютflock Системный вызов для управления доступом к этому ресурсу, вам придется создать такую программу - самостоятельно скомпилировав исходный код BSD или написав собственную эквивалентную программу (возможно, на Perl, Ruby или на другом языке, который предоставляетflock как часть его интерфейса системы высокого уровня).

Если, однако, все, что вам нужно, это способ синхронизации доступа к файлу из сценария, и у вас нет других программ, уже написанных, пытающихся сделать это с помощьюflockВы могли бы использоватьlockfile команда, которая идет сprocmail пакет. OS X используется для доставки сprocmail; это больше не делает, но вы можете установить его, например, с помощьюHomebrew.

орыми незначительными изменениями, я не запускал никаких тестов, но базовая функциональность работает.

Вы можете получить источник отftp://ftp.kernel.org//pub/linux/utils/util-linux, Затем вам нужно заменить некоторые вызовы строковых функций, недоступных в OSX, и вы готовы к работе.

Вот:https://gist.github.com/Ahti/4962822 мой модифицированный flock.c версии 2.22.1, вам все еще нужны другие источники для заголовков.

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 утилита командной строки илиflock особенность?

flock(1) недоступен в OS X.flock(2) (функция C для блокировки файлов),однако.

Написание простой командной строкиflock(1) утилита, использующаяflock(2) должно быть тривиальным.

flock команда существует на OS X, но она существует на BSD, что должно сделать его достаточно простым для переноса на OS X.

Ближайший доступныйshlock команда (справочная страница), но он не такой надежный или безопасный, какflock.

Лучше всего подумать о портировании версии для Linux или BSDflock в OS X.

flock(1) команда для использования в программировании оболочки из-за того, как работает блокировка файлов. Блокировка находится в дескрипторе, а не в inode или записи каталога.

Поэтому, если вы реализуете команду оболочки, которая собирает что-то, как только команда блокировки завершится, и сценарий оболочки перейдет к следующей команде, дескриптор, который удерживал блокировку, исчезнет, и поэтому блокировка не будет сохранена.

Единственный способ реализовать это - встроенная оболочка. Кроме того, вы должны переписать на языке программирования, который на самом деле поддерживаетflock(2) напрямую, например, Perl.

https://github.com/discoteq/flock

Я проверил его, и он хорошо работает на OSX в качестве замены для стека util-linux.

ВАШ ОТВЕТ НА ВОПРОС