Есть ли команда Flock в Mac OS X, которая управляет блокировкой файлов?
Mac OS X эквивалент команды Linux flock (1)
Ответ 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, вам все равно нужны другие источники для заголовков.
Ответ 6
Может быть, может использоваться lockfile
.
Ответ 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.