मैं अंत में एक समस्या से उबने में कामयाब रहा हूं जो मैं कुछ हफ्तों से संघर्ष कर रहा था। मैं दूरस्थ रूप से कमांड चलाने के लिए "अधिकृत कुंजी" के साथ SSH का उपयोग करता हूं। जब मैं थोड़ी देर के पाश में करता हूं, तब तक सब ठीक है। पाश एक ssh कमांड के साथ किसी भी पुनरावृत्ति को पूरा करने के बाद समाप्त होता है।
लंबे समय तक मुझे लगा कि यह किसी प्रकार की ksh अजीबता है, लेकिन मैंने अब खोजा है कि वास्तव में bash क्या पहचान का व्यवहार करता है।
समस्या को पुन: उत्पन्न करने के लिए एक छोटा सा नमूना कार्यक्रम। यह एक बड़े कार्यान्वयन से डिस्टिल्ड है जो स्नैपशॉट लेता है और उन्हें क्लस्टर में नोड्स के बीच दोहराता है।
#!/bin/bash
set -x
IDTAG=".*zone"
MARKER="mark-$(date +%Y.%m.%d.%H.%M.%S)"
REMOTE_HOST=sol10-target
ZFSPARENT=rpool
ssh $REMOTE_HOST zfs list -t filesystem -rHo name,mounted $ZFSPARENT | grep "/$IDTAG " > /tmp/actionlist
#for RMT_FILESYSTEM in $(cat /tmp/actionlist)
cat /tmp/actionlist | while read RMT_FILESYSTEM ISMOUNTED
do
echo ${RMT_FILESYSTEM}@${MARKER}
[ "$ISMOUNTED" = "yes" ] && ssh $REMOTE_HOST zfs snapshot -r ${RMT_FILESYSTEM}@${MARKER}
echo Remote Command Return Code: $?
done
(नोट: zfs सूची "-H" विकल्प के व्यवहार की परिभाषा के अनुसार grep खोज अभिव्यक्ति में एक TAB वर्ण है।)
मेरे नमूने में रूट के लिए कुछ ZFS फाइल सिस्टम हैं जहाँ सभी "ज़ोन" में एक समान नाम वाले डेटासेट पर अपना रूट फाइल सिस्टम है।
POOL / क्षेत्र / app1zone
POOL / क्षेत्र / समूह 2 / app2zone
आदि।
उपरोक्त लूप को प्रत्येक चयनित डेटासेट के लिए एक स्नैपशॉट बनाना चाहिए, लेकिन इसके बजाय यह केवल पहले एक पर काम करता है और फिर बाहर निकलता है।
यह प्रोग्राम पाता है कि स्क्रिप्ट मौजूद होने के बाद डेटासेट की सही संख्या "/ tmp / एक्शनलिस्ट" फ़ाइल की जांच करके आसानी से पुष्टि की जा सकती है।
यदि ssh कमांड को प्रतिस्थापित किया जाता है, उदाहरण के लिए, एक इको कमांड, तो लूप सभी इनपुट लाइनों के माध्यम से पुनरावृत्त करता है। या मेरे पसंदीदा - अपमानजनक आदेश के लिए "प्रतिध्वनि" प्रस्तुत करना।
यदि मैं लगातार लूप के लिए उपयोग करता हूं तो यह भी काम करता है, लेकिन डेटासेट की सूची के संभावित आकार के कारण यह अधिकतम विस्तारित कमांड लाइन की लंबाई के साथ समस्याएं पैदा कर सकता है।
मुझे अब 99.999% यकीन है कि उन में ssh कमांड वाले केवल लूप मुझे समस्याएं देते हैं!
ध्यान दें कि वह क्रम जिसमें ssh कमांड चलता है, पूरा होता है! यह ऐसा है जैसे डेटा लूप में आने के दौरान अचानक खो जाता है ... यदि पहली कुछ इनपुट लाइनें ssh कमांड नहीं करती हैं, तो लूप तब तक चलता है जब तक वह वास्तव में SSH कमांड को रन नहीं करता है।
मेरे लैपटॉप पर जहां मैं यह परीक्षण कर रहा हूं, मेरे पास दो सोलारिस 10 वीएम हैं जिनमें केवल दो या तीन सैंपल डेटासेट हैं, लेकिन वही बड़े स्पार्क सिस्टम पर हो रहा है, जहां यह लाइव होने के लिए है, और कई डेटासेट हैं।
actionlist
। Ssh के मानक इनपुट को पुनर्निर्देशित करने का प्रयास करें/dev/null