त्रुटि पर छोड़ने से xargs रोकें


27

मैन पेज के अनुसार, यदि निष्पादन की कोई रेखा 255 की त्रुटि के साथ बाहर निकलती है, तो xargs छोड़ देगा:

यदि कमांड का कोई भी आह्वान 255 की स्थिति के साथ बाहर निकलता है, तो xargs बिना किसी और इनपुट को पढ़े तुरंत रुक जाएगा। ऐसा होने पर stderr पर एक त्रुटि संदेश जारी किया जाता है।

मैं ऐसा नहीं करने के लिए xargs कैसे प्राप्त कर सकता हूं ?

मेरे पास 1500 या इतनी लाइन बैच की नौकरी है जिसे मैं चलाना चाहता हूं, एक बार में 50 लाइनें। मुझे लग रहा था कि यह हमेशा एक निश्चित रेखा पर मर रहा था, और काम पूरा नहीं कर रहा था। अच्छा नही!

एक बेहतर सवाल, यह बताने का प्रश्न कि मैं क्या करने की कोशिश कर रहा हूं, यह है:

मैं एक बार में 1500 लाइन बैच स्क्रिप्ट, 50 लाइनें कैसे चला सकता हूं, ताकि यह बीच में ही नौकरी न छोड़ दे, और इसलिए आउटपुट किसी तरह की लॉग फाइल में कैद हो जाए?

जवाबों:


12

आप पर्ल स्क्रिप्ट को एक और सरल बैश स्क्रिप्ट के साथ लपेट सकते हैं:

#!/bin/bash
real-command "$@" || exit 0

इसे वास्तविक-कमांड कहेंगे यह सभी पैरामीटर जो आप इस नकली-कमांड को पास करते हैं और यह हमेशा 0 एग्जिट कोड लौटाएगा (इसका मतलब है कि यह हमेशा सफल होता है) और xargs इसके साथ कभी नहीं रुकेगा।



9

आप अपने कमांड लाइनों के रिटर्न कोड को मास्क करने के लिए अपना xargs मंगलाचरण लिख सकते हैं। निम्नलिखित की तरह कुछ के साथ, सोचेमॉन्डxargs द्वारा एग्ज़िट कोड नहीं लौटाएँगे :

xargs sh -c "somecommand || :"

मैं एक अच्छा समाधान के साथ आया हूं: सुनिश्चित करें कि संसाधित किए जा रहे आदेश 255 स्थिति के साथ बाहर नहीं निकलते हैं! अतिरिक्त विवरण संसाधित होने वाली कमांड एक पर्ल स्क्रिप्ट है। Perl die () फ़ंक्शन का उपयोग कई जगहों पर बाहर निकलने के लिए किया जा रहा था यदि कुछ महत्वपूर्ण त्रुटि हुई (जैसे डेटाबेस से कनेक्ट नहीं हो सकती)। हालांकि, डाई () हमेशा त्रुटि स्थिति 255 से बाहर निकलता है। इस मामले में समाधान प्रिंट और निकास () के संयोजन के साथ डाई () को बदलने के लिए था, साथ ही एक अधिक उचित त्रुटि कोड ("1" इस मामले में काम किया)।
JDS

6

बस इस एक मजेदार जवाब मिला, हालांकि इसकी उपयोगिता उस कमांड पर निर्भर करेगी जिसे आप चलाने की कोशिश कर रहे हैं।

यदि आप मूल रूप से आदेशों की एक सूची को इकट्ठा करने के लिए xargs का उपयोग कर रहे हैं, तो आप इस व्यवहार को आदेशों को प्रतिध्वनित करने के लिए xargs कहकर प्राप्त कर सकते हैं, फिर bash करने के लिए पाइपिंग कर सकते हैं।

उदाहरण के लिए, यदि आप उन चीजों की सूची को हटाने की कोशिश कर रहे हैं जो मौजूद हो सकती हैं या नहीं:

# presume this will fail in a similar way to your command
cat things_to_delete | xargs -n1 delete_command_that_might_exit

# instead echo the commands and pipe to bash
cat things_to_delete | xargs -n1 echo delete_command_that_might_exit | bash

यह काम करता है क्योंकि, पहले, xargs केवल कभी इको कॉल कर रहा है, इसलिए यह कोई त्रुटि नहीं देखेगा। फिर दूसरा, क्योंकि विफल बयान के बाद निष्पादन को जारी रखने के लिए बैश का डिफ़ॉल्ट व्यवहार।

मेरे मामले के बारे में अधिक विशिष्ट होने के लिए, मैं इसका उपयोग एडब्ल्यूएस इलास्टिकबिनस्टॉक जैसे पुराने एप्लिकेशन संस्करणों का एक गुच्छा निकालने के लिए कर रहा था:

aws elasticbeanstalk describe-application-versions --application-name myapp |\
jq -r '.ApplicationVersions | sort_by(.DateCreated) | .[0:-10] | .[].VersionLabel' |\
xargs -n1 \
  echo aws elasticbeanstalk delete-application-version \
       --delete-source-bundle --application-name myapp --version-label |\
bash

4

मेरे लिए निर्माण कार्य निम्नलिखित हैं:

ls | xargs -I % svn upgrade %

यहां तक ​​कि अगर svn उन्नयन कुछ तत्व पर विफल रहा, तो प्रक्रिया जारी रखी गई थी


3

यदि आप के xargsसाथ उपयोग कर रहे थे find, तो इसके बजाय -execविकल्प का findउपयोग करें:

find . -name '*.log' -exec somecommand {} \;

1
कैसे हो। मैं इसका इस्तेमाल कर सकता था, लेकिन -exec ऑप्शन xargs can and does का उपयोग करते हुए ऑपरेशनों को समानांतर नहीं करता है
JDS

2
धन्यवाद - मुझे नहीं पता था कि xargsसमानांतर में कमांड चला सकते हैं। ठंडा। यदि आप केवल कमांड इनवोकेशन की संख्या को कम करना चाहते हैं, तो -execएक +पैरामीटर है।
रोजर डाहल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.