मैं समानांतर में कई बैश शेल स्क्रिप्ट चलाना चाहता हूं। हालांकि, मैं दौड़ की स्थिति से बचना चाहता हूं। क्या यूनिक्स कमांड वास्तव में परमाणु हैं जो मैं इस उद्देश्य के लिए उपयोग कर सकता हूं, और मैं उनका उपयोग कैसे कर सकता हूं?
मैं समानांतर में कई बैश शेल स्क्रिप्ट चलाना चाहता हूं। हालांकि, मैं दौड़ की स्थिति से बचना चाहता हूं। क्या यूनिक्स कमांड वास्तव में परमाणु हैं जो मैं इस उद्देश्य के लिए उपयोग कर सकता हूं, और मैं उनका उपयोग कैसे कर सकता हूं?
जवाबों:
यदि 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"
}
#!/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
यह सुनिश्चित करता है कि "(" और ")" के बीच का कोड एक बार में केवल एक प्रक्रिया द्वारा चलाया जाता है और यह प्रक्रिया बहुत लंबे समय तक लॉक की प्रतीक्षा करती है।
lockf(1)
:।
lockf(1)
इस उदाहरण में उपयोग किए गए तरीके से काम नहीं करता है, हालांकि। यह एक तर्क के रूप में फाइल डिस्क्रिप्टर नंबर नहीं ले सकता है।
लॉकफाइल (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" झंडे को हमेशा के लिए प्रतीक्षा करें।
सिस्टम कॉल mkdir()
POSIX फाइल सिस्टम पर परमाणु है। इसलिए, mkdir
इस तरह से कमांड का उपयोग करना कि इसमें mkdir()
आपके उद्देश्य को प्राप्त करने के लिए एक कॉल शामिल है । (IOW, उपयोग न करें mkdir -p
)। इसी अनलॉक rmdir
बेशक है।
कैवेट एम्प्टर: mkdir()
नेटवर्क फाइल सिस्टम पर परमाणु नहीं हो सकता है।
rmdir
इसलिए भी परमाणु?
हो सकता है कि लॉकफाइल कमांड वही करेगा जो आपको चाहिए।
lockfile ~/.config/mylockfile.lock
.....
rm -f important.lock
यदि आप केवल यूनिक्स पर चल रहे हैं, तो पोजोस का उपयोग करें। आप कार्य रिकॉर्ड को पंद्रहवें तक लिख सकते हैं और इस फ़ाइल से पढ़ी जाने वाली प्रक्रियाएँ हैं और आपके पाठक पंद्रह को ब्लॉक कर देंगे।
लॉक फाइलें ठीक हैं, लेकिन आप जो वर्णन करते हैं उसके लिए मैं पंद्रह के साथ जाऊंगा
जैसा कि यहां पोस्ट किया गया है: " शेल स्क्रिप्ट्स में सही लॉकिंग? ", FLOM (फ्री लूक मैनेजर) टूल का उपयोग करके , कमांड और शेल स्क्रिप्ट्स को क्रमबद्ध करना उतना ही आसान हो जाता है जितना कि रनिंग
flom -- command_to_serialize
FLOM आपको अधिक स्पष्ट उपयोग के मामलों (वितरित लॉकिंग, पाठकों / लेखकों, संख्यात्मक संसाधनों, आदि ...) को यहां बताए अनुसार लागू करने की अनुमति देता है: http://sourceforge.net/p/flom/wiki/FLOM%20by%20exam//
make(1)
को लेने की अनुमति देता है ? (यानी,make -j 9
अगर आपके पास 8 कोर हैं)? इसमें बारीक ग्रैन्युलैरिटी के साथ इंटरलेविंग कार्य का अतिरिक्त लाभ है।