झुंड में कई कमांड पास करें


12
flock -x -w 5 ~/counter.txt 'COUNTER=$(cat ~/counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'

flockउपरोक्त उदाहरण में मैं कई कमांड कैसे पास करूंगा ?

जहां तक ​​मैं समझता हूं, flockअलग-अलग झंडे लेता है (एक्सएक्सएक्स के लिए एक्स-एक्स के लिए), फिर लॉक करने के लिए फ़ाइल, और फिर चलाने के लिए कमांड। मुझे यकीन नहीं है कि मैं इस फ़ंक्शन में दो कमांड कैसे पारित करूंगा (लॉक फ़ाइल की सामग्री के साथ चर सेट करें, और फिर इस फ़ाइल को बढ़ाएं)।

यहाँ मेरा लक्ष्य हर बार किसी स्क्रिप्ट के लिए counter.txtफ़ाइल को एक्सेस करने की कोशिश करने पर लॉक करके किसी फ़ाइल के लिए कुछ परमाणु वृद्धि करना है ।

जवाबों:


8

एक खोल स्पष्ट रूप से आह्वान करें।

flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'

ध्यान दें कि आपके द्वारा परिवर्तित किया गया कोई भी चर उस शेल उदाहरण के लिए स्थानीय है। उदाहरण के लिए, COUNTERचर को कॉलिंग स्क्रिप्ट में अपडेट नहीं किया जाएगा: आपको इसे फ़ाइल से वापस पढ़ना होगा (लेकिन यह इस बीच बदल गया हो सकता है), या कमांड के आउटपुट के रूप में:

new_counter=$(flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) | tee ~/counter.txt')

बहुत बढ़िया, बहुत बहुत धन्यवाद! आपके द्वारा प्रदान की गई व्याख्या ने निश्चित रूप से मुझे सिरदर्द के एक और घंटे से बचाया
d -_- b

4

या आप एक फ़ाइल डिस्क्रिप्टर झुंड कर सकते हैं

exec {counterfd}<~/counter.txt
flock -x -w 5 "$counterfd"
COUNTER=$(cat ~/counter.txt)
COUNTER=$(( COUNTER +1 ))
echo "$COUNTER" >~/counter.txt
exec {counterfd}<&-

इसका लाभ यह भी है कि आप सब्सक्रिप्शन आधारित दृष्टिकोणों के विपरीत, सीधे काउंटर वेरिएबल का उपयोग करने की अनुमति देते हैं।


कृपया आप समझाएंगे exec {counterfd}? अपने आप में, डेबियन त्रुटियों not found, लेकिन यह पुनर्निर्देशन के साथ 0 देता है। बहुत अजीब।
स्टीव बादाम

2

flockउपकरण एक छोटे से उपयोग करने के लिए मुश्किल है और आदमी पृष्ठ बहुत कम है। उपकरण का उपयोग करने के लिए मैन पेज तीन तरीके प्रदान करता है:

  • flock [options] <file|directory> <command> [command args]
  • flock [options] <file|directory> -c <command>
  • flock [options] <file descriptor number>

जिस तरह से यह प्रश्न है मैं निश्चित रूप से तीसरे रूप का उपयोग करूंगा flock। यदि आप मैन पेज में और नीचे flockजाते हैं तो कुछ उदाहरण हैं जो तीसरे फॉर्म का उपयोग करने के लिए सटीक सिंटैक्स दिखाते हैं:

#!/bin/bash
(
 flock -n 9 || exit 1
 echo "commands executed under lock..."
 echo "go here..."
) 9>/tmp/mylockfile

मैंने जोड़ा #!/bin/bash

मैंने इस फॉर्म का सफलतापूर्वक उपयोग किया है flock

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