Unix कमांड का उपयोग सेमीफोर / लॉक के रूप में क्या किया जा सकता है?


34

मैं समानांतर में कई बैश शेल स्क्रिप्ट चलाना चाहता हूं। हालांकि, मैं दौड़ की स्थिति से बचना चाहता हूं। क्या यूनिक्स कमांड वास्तव में परमाणु हैं जो मैं इस उद्देश्य के लिए उपयोग कर सकता हूं, और मैं उनका उपयोग कैसे कर सकता हूं?


आप क्या कर रहे हैं कि समानांतर काम की आवश्यकता है? क्या आप आश्रितों को इस तरह से व्यक्त नहीं कर सकते हैं जो एक समानांतर make(1)को लेने की अनुमति देता है ? (यानी, make -j 9अगर आपके पास 8 कोर हैं)? इसमें बारीक ग्रैन्युलैरिटी के साथ इंटरलेविंग कार्य का अतिरिक्त लाभ है।
वॉनब्रांड

जवाबों:


30

यदि lockfileआपके सिस्टम पर स्थापित नहीं है, तो mkdirकाम करेंगे: यह एक परमाणु ऑपरेशन है, और यह विफल रहता है यदि निर्देशिका पहले से मौजूद है (जब तक आप -pकमांड-लाइन स्विच नहीं जोड़ते हैं )।

create_lock_or_wait () {
  path="$1"
  wait_time="${2:-10}"
  while true; do
        if mkdir "${path}.lock.d"; then
           break;
        fi
        sleep $wait_time
  done
}

remove_lock () {
  path="$1"
  rmdir "${path}.lock.d"
}

26

flock(1)

#!/bin/bash

# Makes sure we exit if flock fails.
set -e

(
  # Wait for lock on /var/lock/.myscript.exclusivelock (fd 200) for 10 seconds
  flock -x -w 10 200

  # Do stuff

) 200>/var/lock/.myscript.exclusivelock

यह सुनिश्चित करता है कि "(" और ")" के बीच का कोड एक बार में केवल एक प्रक्रिया द्वारा चलाया जाता है और यह प्रक्रिया बहुत लंबे समय तक लॉक की प्रतीक्षा करती है।


अच्छा लगा, इसके बारे में पता नहीं था। हालांकि, यह स्पष्ट रूप से लिनक्स-विशिष्ट है ...
रिकार्डो मुरारी

1
@ रीकोर्डो, फ्रीबीएसडी में एक समान कमांड है lockf(1):।
एलेक्स बी

lockf(1)इस उदाहरण में उपयोग किए गए तरीके से काम नहीं करता है, हालांकि। यह एक तर्क के रूप में फाइल डिस्क्रिप्टर नंबर नहीं ले सकता है।
चार्ली

11

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

इसका उपयोग करना सरल है:

#!/bin/sh
LOCKFILE=$HOME/.myscript/lock
mkdir -p `dirname $LOCKFILE`

echo Waiting for lock $LOCKFILE...
if lockfile -1 -r15 $LOCKFILE
then
    # Do protected stuff here
    echo Doing protected stuff...

    # Then, afterward, clean up so another instance of this script can run
    rm -f $LOCKFILE
else
    echo "Failed to acquire lock!  lockfile(1) returned $?"
    exit 1
fi

मैंने जो विकल्प दिए हैं वे इसे 15 सेकंड तक एक बार फिर से प्रयास करें। यदि आप चाहते हैं कि "-r" झंडे को हमेशा के लिए प्रतीक्षा करें।


2
बस संदर्भ के लिए - मैन पेज: linux.die.net/man/1/lockfile । :)
लुकास जोन्स

इस बात से अवगत रहें कि (मैनपेज के अनुसार), "एक बार किसी फाइल के लॉक हो जाने के बाद, हर पांच मिनट में कम से कम एक बार लॉक को छूना चाहिए या लॉक को बासी माना जाएगा, और बाद में लॉक के प्रयास सफल होंगे।"
Jay

6

सिस्टम कॉल mkdir()POSIX फाइल सिस्टम पर परमाणु है। इसलिए, mkdirइस तरह से कमांड का उपयोग करना कि इसमें mkdir()आपके उद्देश्य को प्राप्त करने के लिए एक कॉल शामिल है । (IOW, उपयोग न करें mkdir -p)। इसी अनलॉक rmdirबेशक है।

कैवेट एम्प्टर: mkdir()नेटवर्क फाइल सिस्टम पर परमाणु नहीं हो सकता है।


है rmdirइसलिए भी परमाणु?
अलेक्सेज मगुरा

3

हो सकता है कि लॉकफाइल कमांड वही करेगा जो आपको चाहिए।

lockfile ~/.config/mylockfile.lock
.....
rm -f important.lock

यह गलत फ़ाइल को हटाने के लिए लगता है।
बेंजामिन डब्ल्यू।

1

यदि आप केवल यूनिक्स पर चल रहे हैं, तो पोजोस का उपयोग करें। आप कार्य रिकॉर्ड को पंद्रहवें तक लिख सकते हैं और इस फ़ाइल से पढ़ी जाने वाली प्रक्रियाएँ हैं और आपके पाठक पंद्रह को ब्लॉक कर देंगे।

लॉक फाइलें ठीक हैं, लेकिन आप जो वर्णन करते हैं उसके लिए मैं पंद्रह के साथ जाऊंगा


1
क्या आप इस बारे में विस्तृत जानकारी दे सकते हैं कि आपको कैसे लगता है कि पडोसी दौड़ की स्थिति को रोक सकते हैं?
जी-मैन का कहना है कि 'मोनिका'

0

जैसा कि यहां पोस्ट किया गया है: " शेल स्क्रिप्ट्स में सही लॉकिंग? ", FLOM (फ्री लूक मैनेजर) टूल का उपयोग करके , कमांड और शेल स्क्रिप्ट्स को क्रमबद्ध करना उतना ही आसान हो जाता है जितना कि रनिंग

flom -- command_to_serialize

FLOM आपको अधिक स्पष्ट उपयोग के मामलों (वितरित लॉकिंग, पाठकों / लेखकों, संख्यात्मक संसाधनों, आदि ...) को यहां बताए अनुसार लागू करने की अनुमति देता है: http://sourceforge.net/p/flom/wiki/FLOM%20by%20exam//

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.