Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Как script:

#!/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

Здесь кросс-платформенная команда flock:

https://github.com/discoteq/flock

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

Ответ 3

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

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

Лучше всего смотреть на перенос либо версии Linux, либо BSD flock в OS X.

Ответ 4

Вы ищете flock утилиту командной строки или flock функцию?

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

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

Ответ 5

Просто для полноты, вы можете скомпилировать flock (2) для OSX с некоторыми незначительными изменениями, я не запускал никаких тестов, но работает базовая функциональность.

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

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

Ответ 7

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

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

Ответ 8

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

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

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