Вопрос по shell, macos – Mac OS X эквивалент команды Linux flock (1)

22

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

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

Ваш Ответ

8   ответов
2

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

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

1

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

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

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

10

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); 
Обратите внимание, что эта эмуляция Perl очень неполная - она поддерживает только формуflock FILE COMMANDS... а неflock FD form (также он не поддерживает ни одну из опций flock (1)).
@ Ян В будущем вам, вероятно, не следует вносить изменения в код чужого ответа. Не стесняйтесь представить предложенное вами изменение в качестве комментария и позвольте автору сделать звонок относительно того, хочет ли он или она изменить свой ответ или нет (9 раз из 10, если это ошибка, они исправят это). Не стесняйтесь редактировать ответы для существенных изменений для ясности или форматирования, но не изменяйте сам ответ.
1

flock утилита командной строки илиflock особенность?

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

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

& quot; Написание простой утилиты flock (1) из командной строки с использованием flock (2) должно быть тривиальным. & quot; настолько тривиально, что вы будете достаточно любезны, чтобы поделиться им с не-C разработчиком?
2

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

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

you should look at the lockfile command (comes with procmail, standard on OS X). lockfile: command not found на El Capitan (10.11.6) так что нетnot standard.
Спасибо за обновление, @sukima. Исправленный.
3

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

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

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

-5

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

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

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

Я правильно понимаю? Блокировка сохраняется только до тех пор, пока процесс запущен. Таким образом, простая обертка вокруг flock (2) сохранит блокировку только во время работы. В сценарии блокировка будет снята до вызова следующей команды, верно?
Linux & APOS; sflock(1) не является тривиальной оберткой вокруг стада (2).
@tchrist,flock(1) не является оболочкой, встроенной даже в Linux, так что это, очевидно, неверно. Скорее, прикрепление блокировки к дескриптору файла применяется к этому FD даже между процессами, так что он также может изменять родительский экземпляр.
@jboi - команда flock (1) принимает либо команду оболочки (которая запускается при удержании блокировки), либо номер дескриптора файла, который должен быть заблокирован - в последнем случае дескриптор файла открывается в вызывающей программе (если она скрипт оболочки, использующийexec 9>$LOCKFILE или аналогичный) и остается открытым после выхода команды flock. Что касается утверждения @ tchrist о том, что вы не можете написать стадо уровня оболочки - я верю (почти) всему, что он говорит о Perl, но в этом он ошибается. Команда flock запускает заблокированные команды (если передано имя файла) или передается номер дескриптора файла - это работает!
12

https://github.com/discoteq/flock

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

спасибо за регистрацию билетов с Discoteq / Flock, я ценю это!
Ааа - как-x по умолчанию в этой реализации. Хорошо, имеет смысл прочитать страницу руководства. :)
Как претендовать на успех, но на самом деле не предпринимать действий (ведя себя как шлейф) лучше, чем терпеть неудачу явно?
Я подал запрос на добавление функции-x как неоперируемый здесь -github.com/discoteq/flock/issues/9
@ Sneak вы можете обновить свой ответ, щедрый участник недавно добавил-x флаг, а также длинные варианты.

Похожие вопросы