2012-05-10 7 views

उत्तर

2

मैं नहीं मानता कि flock आदेश ओएस एक्स पर मौजूद है, लेकिन यह है कि उपलब्ध है बीएसडी जो ओएस एक्स के लिए यह काफी बंदरगाह करने के लिए आसान बनाना चाहिए

करीबी पर मौजूद है shlock कमांड (man page) है, लेकिन यह flock के रूप में मजबूत या सुरक्षित नहीं है।

आपका सबसे अच्छा शर्त ओएस एक्स

1

आप flock कमांड लाइन उपयोगिता या flock सुविधा के लिए देख रहे करने के लिए flock के दोनों लिनक्स या बीएसडी संस्करण पोर्टिंग को देखने के लिए हो सकता है?

flock(1) ओएस एक्स flock(2) (फ़ाइल लॉकिंग के लिए सी फ़ंक्शन) पर अनुपलब्ध है, however is

flock(2) का उपयोग करके एक साधारण कमांड लाइन flock(1) उपयोगिता लिखना तुच्छ होना चाहिए।

-5

आप लॉक लॉकिंग के तरीके के कारण खोल प्रोग्रामिंग में उपयोग के लिए शेल-स्तरीय झुंड (1) कमांड नहीं लिख सकते हैं। लॉक डिस्क्रिप्टर पर है, न कि इनोड या निर्देशिका प्रविष्टि पर।

इसलिए, यदि आप एक शेल कमांड को कार्यान्वित करते हैं जो लॉकिंग कमांड से बाहर निकलता है और शेल स्क्रिप्ट अगले कमांड पर चलता है, तो लॉक रखने वाले वर्णक गायब हो जाते हैं और इसलिए कोई लॉक बरकरार नहीं होता है।

इसे लागू करने का एकमात्र तरीका एक खोल निर्मित के रूप में होगा। वैकल्पिक रूप से, आपको प्रोग्रामिंग भाषा में फिर से लिखना होगा जो वास्तव में झुंड (2) का समर्थन करता है, जैसे कि पर्ल।

+0

लिनक्स [झुंड (1)] (http://linux.die.net/man/1/flock) झुंड के चारों ओर एक छोटा सा रैपर नहीं है (2)। – Gilles

+0

क्या मैं इसे सही समझता हूं? लॉक केवल तभी रखा जाता है जब तक प्रक्रिया चल रही हो। तो, झुंड के चारों ओर एक साधारण आवरण (2) लॉक को केवल एक धीमा रखेगा क्योंकि यह चल रहा है। एक स्क्रिप्ट में अगले आदेश को कॉल करने से पहले लॉक जारी किया जाएगा, है ना? – jboi

+2

@jboi - झुंड (1) कमांड या तो एक शेल कमांड लेता है (जो ताला पकड़े हुए चलाया जाता है) या फ़ाइल डिस्क्रिप्टर की संख्या जिसे लॉक किया जाना चाहिए - बाद के मामले में कॉलर में फ़ाइल डिस्क्रिप्टर खोला जाता है (यदि यह 'exec 9> $ LOCKFILE'' या इसी तरह का उपयोग करके एक शेल स्क्रिप्ट है) और झुंड कमांड निकलने के बाद खुला रहता है। @ Tchrist के दावे के लिए कि आप एक शैल लेवल झुंड नहीं लिख सकते - ठीक है, मैं पर्ल के बारे में जो कुछ भी कहता हूं (लगभग) मैं विश्वास करता हूं, लेकिन इस पर वह गलत है। झुंड कमांड लॉक किए गए कमांड चलाता है (यदि फ़ाइल नाम पास किया गया है) या फ़ाइल डिस्क्रिप्टर नंबर पारित किया गया है - यह काम करता है! –

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); 
+2

@Yan भविष्य में, आपको शायद किसी और के जवाब में कोड परिवर्तन नहीं करना चाहिए। अपने सुझाए गए संपादन को एक टिप्पणी के रूप में सबमिट करने के लिए स्वतंत्र महसूस करें और लेखक को कॉल करें कि वह अपना जवाब बदलना चाहे या नहीं (10 में से 9 गुना, अगर यह गलती है, तो वे इसे ठीक कर देंगे)। स्पष्टता या स्वरूपण के लिए पर्याप्त परिवर्तनों के उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें, लेकिन उत्तर को स्वयं न बदलें। – Rob

+1

ध्यान दें कि यह पर्ल इम्यूलेशन बहुत अपूर्ण है - यह केवल ''झुंड फ़ाइल कमांड' फॉर्म का समर्थन करता है और' 'झुंड एफडी 'फॉर्म नहीं है (न ही यह किसी भी झुंड (1) विकल्पों का समर्थन करता है)। –

1

बस पूर्णता के लिए, आप झुंड संकलन कर सकते हैं (2) OSX के लिए कुछ मामूली परिवर्तन के साथ, मेरे पास है कोई परीक्षण नहीं चलाएं, लेकिन बुनियादी कार्यक्षमता काम करती है।

आप ftp://ftp.kernel.org//pub/linux/utils/util-linux से स्रोत प्राप्त कर सकते हैं। इसके बाद आपको ओएसएक्स पर उपलब्ध स्ट्रिंग फ़ंक्शंस में कुछ कॉलों को प्रतिस्थापित करने की आवश्यकता नहीं है, और आप जाने के लिए अच्छे हैं।

यहां: https://gist.github.com/Ahti/4962822 संस्करण 2.22.1 का मेरा संशोधित flock.c है, फिर भी आपको हेडर के लिए अन्य स्रोतों की आवश्यकता है।

1

वहाँ ओएस एक्स पर कोई flock आदेश, नहीं है।यदि आपको एक शेल स्क्रिप्ट की आवश्यकता है जो उस संसाधन के उपयोग के लिए flock सिस्टम कॉल का उपयोग करने वाले प्रोग्राम्स के साथ लॉक करने योग्य संसाधन साझा कर सकता है, तो आपको बीएसडी स्रोत को स्वयं संकलित करके, या अपना समकक्ष प्रोग्राम लिखकर ऐसा प्रोग्राम बनाना होगा (शायद पर्ल या रूबी या किसी अन्य भाषा में जो flock को अपने उच्च स्तरीय सिस्टम इंटरफेस के हिस्से के रूप में उजागर करता है)।

अगर, हालांकि, आप सभी की जरूरत एक shellscript से एक फ़ाइल के लिए उपयोग सिंक्रनाइज़ करने के लिए एक रास्ता है, और आप पहले से ही अन्य कार्यक्रमों flock के साथ ऐसा करने की कोशिश कर लिखा नहीं है, आप lockfile आदेश है, जो आता है इस्तेमाल कर सकते हैं procmail पैकेज के साथ। ओएस एक्स procmail के साथ जहाज के लिए इस्तेमाल किया जाता था; यह अब नहीं करता है, लेकिन आप इसे उदाहरण के माध्यम से इंस्टॉल कर सकते हैं Homebrew

+0

_ आपको लॉकफ़ाइल कमांड (ओएस एक्स पर मानक, प्रोसेमेल के साथ आता है) पर देखना चाहिए। _ 'लॉकफाइल: एल कैपिटन (10.11.6) पर कमांड नहीं मिला है, इसलिए यह ** मानक नहीं है **। – Sukima

+0

अद्यतन के लिए धन्यवाद, @ सुकिमा। सही किया। –

8

एक पार मंच झुंड यहाँ आदेश है:

https://github.com/discoteq/flock

मैं इसे परीक्षण किया है और यह util-linux झुंड के लिए एक ड्रॉप में स्थानापन्न के रूप में पर OSX अच्छी तरह से काम करता है।

+0

सफल होने का दावा कैसे किया जा रहा है लेकिन वास्तव में कार्रवाई करने में विफल रहा है (एक नोप के रूप में व्यवहार) स्पष्ट रूप से विफल होने से बेहतर है? –

+0

अहह - '-x' के रूप में उस कार्यान्वयन में डिफ़ॉल्ट है। ठीक है, मैन पेज को पढ़ने के बारे में और अधिक समझ में आता है। :) –

+0

मैंने '-x' को नो-ऑप के रूप में स्वीकार करने के लिए एक फीचर अनुरोध दायर किया - https://github.com/discoteq/flock/issues/9 – studgeek

संबंधित मुद्दे