2015-01-08 10 views
6

मेरे स्क्रिप्ट काम करता है अगर मैं इसे कमांड खोल पर सहभागी चलाएँ:जीएनयू समानांतर के साथ विफल "कमांड नहीं मिला" त्रुटि Crond

$ cat ndmpcopy_cron_parallel_svlinf05.bash 
#!/usr/software/bin/bash 

ndmpcopy_cron_parallel() { 

timestamp=`date +%Y%m%d-%H%M` 
LOG=/x/eng/itarchives/ndmpcopylogs/05_$1/ndmpcopy_status 
TSLOG=${LOG}_$timestamp 

src_filer='svlinf05' 
src_account='ndmp' 
src_passwd='src_passwd' 
dst_svm='svlinfsrc' 
dst_account='vsadmin-backup' 
dst_passwd='dst_passwd' 

host=`hostname` 
echo $host 

ssh -l root $src_filer "priv set -q diag ; ndmpcopy -sa $src_account:$src_passwd -da $dst_account:$dst_passwd -i $src_filer.eng.netapp.com:/vol/$1 10.56.10.161:/$dst_svm/$1" | tee -a $TSLOG 

echo "ndmpcopy Completed: `date` " 

} 

export -f ndmpcopy_cron_parallel 

/u/jsung/bin/parallel -j 0 --wd . --env ndmpcopy_cron_parallel --eta ndmpcopy_cron_parallel ::: local 

लेकिन, स्क्रिप्ट में विफल रहा है और निर्यात समारोह शिकायत की, ndmpcopy_cron_parallel, नहीं पाया जा सकता है:

$ crontab -l 

40 0,2,4,6,8,10,12,14,16,18,20,22 * * * /u/jsung/bin/ndmpcopy_cron_parallel_svlinf05.bash 

त्रुटि:

Subject: Cron <[email protected]> /u/jsung/bin/ndmpcopy_cron_parallel_svlinf05.bash 


Computers/CPU cores/Max jobs to run 
1:local/2/1 

Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete 
ETA: 0s Left: 1 AVG: 0.00s local:1/0/100%/0.0s **/bin/bash: ndmpcopy_cron_parallel: command not found** 
ETA: 0s Left: 0 AVG: 0.00s local:0/1/100%/0.0s 

मुझे चारों ओर खोजा गया है और थोड़ी देर के लिए अलग-अलग चीजों की कोशिश कर रहा है। मैंने $ पैथ भी tweaked। यकीन नहीं है कि मुझे क्या याद आया। क्या हम बीएसएचएच स्क्रिप्ट में जीएनयू समानांतर एम्बेड कर सकते हैं और क्रॉन्टाब में डाल सकते हैं?

+0

कैसे '/ bin/bash' से अलग है '/ usr/सॉफ्टवेयर/bin/bash'? क्रॉन जॉब '/ bin/bash' का उपयोग कर प्रतीत होता है। क्या आपकी स्क्रिप्ट काम करती है जब '/ bin/bash' के साथ चलती है? –

+0

दाएं। बहुत अंतर नहीं है।/usr/सॉफ्टवेयर/बिन वह जगह है जहां हमारी कंपनी उपयोगिताओं को स्टोर करती है।/बिन/बैश मेजबान के साथ डिफ़ॉल्ट स्थान है। $/bin/bash --version जीएनयू बैश, संस्करण 4.1.2 (1) -release (x86_64-redhat-लिनक्स GNU) कॉपीराइट (सी) 2009 फ्री सॉफ्टवेयर फाउंडेशन, Inc लाइसेंस GPLv3 +: जीएनयू जीपीएल संस्करण 3 या बाद में $/usr/software/bin/bash --version जीएनयू बैश, संस्करण 4.2.53 (1) -release (x86_64-अज्ञात -linux-gnu) कॉपीराइट (सी) 2011 फ्री सॉफ्टवेयर फाउंडेशन, इंक लाइसेंस जीपीएलवी 3 +: जीएनयू जीपीएल संस्करण 3 या बाद में jsung8

+0

और क्या आप अपनी स्क्रिप्ट चला सकते हैं मैन्युअल रूप से '/ bin/bash'? (ऐसा लगता है जैसे इसे काम करना चाहिए।) मैं इस समान विधि के बजाय 'समानांतर' से परिचित नहीं हूं, क्या आप इसे स्क्रिप्ट चलाने के लिए प्राप्त कर सकते हैं (और उस फ़ंक्शन को स्क्रिप्ट में डाल सकते हैं)? –

उत्तर

7

बधाई। आप shell-shocked रहे हैं।

आप bash के दो संस्करण आपके सिस्टम पर स्थापित किया है:

  • /bin/bash एक बड़ी पैच न किया गया बैश
  • /usr/सॉफ्टवेयर/bin/bash v4.1.2 v4.2.53 एक मध्यम आयु वर्ग शेलशॉक

बैश संस्करण ट्रिपल में अंतिम संख्या पैच-स्तर है। शेलशॉक बग में कई पैच शामिल थे, लेकिन प्रासंगिक एक 4.1.14, 4.2.50 और 4.3.27 है। यही कारण है कि पैच निर्यात कार्यों का प्रारूप बदल जाता है, परिणाम के साथ कि:

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

दोनों मामलों में, फ़ंक्शन निर्यात नहीं किया जाएगा। दूसरे शब्दों में, आप केवल दो बैश संस्करणों के बीच एक फ़ंक्शन निर्यात कर सकते हैं यदि वे दोनों शैलशॉक पैच किए गए हैं, या यदि न तो शैलशॉक पैच किया गया है।

आपकी स्क्रिप्ट स्पष्ट रूप से इंगित करती है कि इसे चलाने के लिए किस बैश का उपयोग करना है: एक/usr/software/bin/bash, जिसे पैच किया गया है। स्क्रिप्ट जीएनयू समानांतर को आमंत्रित करती है, और जीएनयू समानांतर को आदेश चलाने के लिए एक या अधिक सबहेल शुरू करना पड़ता है। जीएनयू समांतर SHELL पर्यावरण परिवर्तक के मान का उपयोग उस खोल को खोजने के लिए करता है जिसका उपयोग करना चाहिए।

मैं अपने उपयोगकर्ता आदेश खोल वातावरण में, SHELL/usr/software/bin/bash के लिए सेट है, और वातावरण में, जिसमें cron कार्यान्वित, यह /bin/bash पर सेट किया जाता है कि कि लगता है। यदि ऐसा है, तो आपको फ़ैश को निर्यात करने में कोई समस्या नहीं होगी जब आप इसे बैश प्रॉम्प्ट से आज़माते हैं, लेकिन cron वातावरण में आप एक पोस्ट-शेलशॉक बैश से प्री-शेलशॉक बैश में फ़ंक्शन निर्यात करने का प्रयास करेंगे, और जैसा कि परिणाम के ऊपर वर्णित है कि निर्यात को चुपचाप अनदेखा किया जाता है। इसलिए त्रुटि।

समस्या को हल करने के लिए, आपको यह सुनिश्चित करने की आवश्यकता है कि आप कमांड स्क्रिप्ट चलाने के लिए उपयोग किए गए bash का उपयोग bash जैसा जीएनयू समांतर द्वारा उपयोग किया जाता है। उदाहरण के लिए, आप स्पष्ट रूप से जीएनयू समांतर के आविष्कार से पहले खोल सेट कर सकते हैं।

export SHELL=/usr/software/bin/bash 
# ... 
/u/jsung/bin/parallel -j 0 --wd . --env ndmpcopy_cron_parallel --eta ndmpcopy_cron_parallel ::: local 

या फिर आप समानांतर आदेश खुद के लिए यह सेट कर सकते हैं:

SHELL=/usr/software/bin/bash /u/jsung/bin/parallel -j 0 --wd . --env ndmpcopy_cron_parallel --eta ndmpcopy_cron_parallel ::: local 
+0

रिक और ओले, आपकी अंतर्दृष्टि के लिए बहुत बहुत धन्यवाद! शेलशॉक वास्तव में मूल कारण है। काबिल ए तारीफ़!! मुझे लगता है कि एकमात्र चाल "/ बिन/बैश" शेलशॉक वास्तव में crontab द्वारा ट्रिगर किया गया था। मेरे क्रोंटैब में शेल और पैथ जोड़ने के बाद क्रॉन नौकरी आखिरकार बंद हो गई। मुझे लगता है कि अगर हम रिमोट होस्ट पर काम वितरित करते हैं तो शेल स्क्रिप्ट में आवश्यक है। दूसरों के लाभ के लिए मैं महत्वपूर्ण परिवर्तन मैं अगली टिप्पणी मेरी स्क्रिप्ट में – jsung8

+0

परिवर्तन में मेरी स्क्रिप्ट और crontab के लिए किए गए संक्षेप: निर्यात शेल =/usr/सॉफ्टवेयर/bin/bash निर्यात -f ndmpcopy_cron_parallel /यू/jsung/bin/समानांतर -j 0 --env शेल --eta ndmpcopy_cron_parallel ::: स्थानीय crontab पर परिवर्तन: शेल =/usr/सॉफ्टवेयर/bin/bash पथ =/usr/सॉफ्टवेयर/बिन:/यू/jsung/bin – jsung8

2

rici कहते हैं, समस्या ShellShock के कारण हुई है। शैलशॉक ने जीएनयू समांतर को प्रभावित नहीं किया, लेकिन शैलशॉक को ठीक करने के लिए पैच '--env' का उपयोग करके कार्यों को स्थानांतरित कर दिया।

जीएनयू समांतर बैश में शेलशॉक पैच के साथ पकड़ रहा है: बैश ने BASH_FUNC_myfunc() का उपयोग कार्यों के निर्यात के लिए परिवर्तनीय नाम के रूप में किया है, लेकिन हाल के संस्करण BASH_FUNC_myfunc%% का उपयोग करते हैं। तो एक समारोह को स्थानांतरित करते समय जीएनयू समानांतर को यह जानने की जरूरत है।

'10) संस्करण 20141022 में तय किया गया है, और '%%' संस्करण 20150122 में तय होने की उम्मीद है। उन्हें किसी भी संयोजन में काम करना चाहिए। इसलिए आपके रिमोट बैश को आपके स्थानीय बैश के समान ही पैच करने की आवश्यकता नहीं है: जीएनयू समानांतर "सही काम करेगा", और आपके कोड को बदलने की कोई आवश्यकता नहीं है।

Git संस्करण जिसमें दोनों ठीक बाहर का परीक्षण करने के लिए स्वतंत्र महसूस करना चाहिए: Git क्लोन Git: //git.savannah.gnu.org/parallel.git

+0

ओले, --env पर आपकी सलाह के लिए धन्यवाद इसलिए मैंने समानांतर के साथ शेल वातावरण var को जोड़ने के लिए "--env SHELL" का उपयोग किया ... – jsung8

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