Xargs ত্রুটি ছাড়তে বাধা


27

ম্যান পেজ অনুসারে, এক্সারকশনগুলি যদি 255 এর ত্রুটির সাথে এক্সিকিউশন লাইনের বাইরে চলে যায়:

কমান্ডের কোনও প্রার্থনা যদি 255 এর স্থিতি সহ প্রস্থান করে, xargs পরবর্তী কোনও ইনপুট না পড়ে তত্ক্ষণাত বন্ধ হয়ে যাবে। স্টার্ডারে একটি ত্রুটি বার্তা জারি করা হয় যখন এটি ঘটে।

আমি xargs পেতে পারেন না এই কাজ?

আমার একটি 1500 বা তত লাইন ব্যাচের কাজ রয়েছে যা আমি চালাতে চাই, একবারে 50 টি লাইন। আমি খুঁজেছি যে এটি সর্বদা একটি নির্দিষ্ট লাইনে মারা যায়, এবং কাজটি শেষ করে না। ভাল না!

আরও ভাল একটি প্রশ্ন, আমি কী করতে চেষ্টা করছি তা বর্ণনা করার প্রশ্নটি হল:

আমি কীভাবে 1500 লাইনের ব্যাচের স্ক্রিপ্ট, একসাথে 50 টি লাইন চালাতে পারি, যাতে এটি কাজটি মাঝখানে ছেড়ে না দেয়, এবং যাতে আউটপুটটি কোনও ধরণের লগ ফাইলে বন্দী হয়?

উত্তর:


12

আপনি পার্ল স্ক্রিপ্টটি অন্য একটি সাধারণ বাশ স্ক্রিপ্টের সাথে মোড়াতে পারেন:

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

এটি আপনাকে এই জাল-কমান্ডে যে সমস্ত পরামিতিগুলি দেয় তা রিয়েল-কমান্ডকে কল করবে এবং এটি সর্বদা 0 প্রস্থান কোড ফেরত আসবে (এর অর্থ এটি সর্বদা সফল) এবং এর সাথে xargs কখনও থামবে না।



9

আপনি আপনার কমান্ড লাইনের রিটার্ন কোডগুলি মাস্ক করতে আপনার xargs অনুরোধ লিখতে পারেন। নিচের মত কিছু দিয়ে, xargsকখনো দেখতে হবে প্রস্থান কোড পথে ফিরে somecommand :

xargs sh -c "somecommand || :"

আমি একটি ভাল সমাধান নিয়ে এসেছি: নিশ্চিত হয়ে নিন যে কমান্ডগুলি প্রসেস হচ্ছে 255 স্ট্যাটাসের সাথে প্রস্থান না করে! অতিরিক্ত বিশদ বিবরণ প্রক্রিয়াধীন একটি পার্ল স্ক্রিপ্ট। পার্ল ডাই () ফাংশনটি বেশ কয়েকটি জায়গায় ব্যবহার করা হচ্ছিল যদি কিছু গুরুতর ত্রুটি ঘটে (যেমন উদাহরণস্বরূপ একটি ডাটাবেসে সংযোগ স্থাপন করতে না পারে) বাইরে বেরিয়ে আসার জন্য। তবে, ডাই () সর্বদা ত্রুটি স্থিতিশীলতার সাথে প্রস্থান করে 255. এই ক্ষেত্রে সমাধানটি ছিল আরও বেশি যুক্তিসঙ্গত ত্রুটি কোড ("1" এর সাথে কাজ করা) সহ প্রিন্ট এবং প্রস্থান () এর সংমিশ্রণ সহ ডাই () প্রতিস্থাপন করা।
জেডিএস

6

এইটির সবেমাত্র একটি মজার উত্তর পেয়েছে, যদিও এটির দরকারীতা আপনি যে আদেশটি চালানোর চেষ্টা করছেন তার উপর নির্ভর করবে।

আপনি যদি কমান্ডের তালিকাটি মূলত একত্র করার জন্য xargs ব্যবহার করে থাকেন তবে আপনি xargs কে কমান্ড প্রতিধ্বনি করতে বলার মাধ্যমে, তারপরে ব্যাশে পিপ করে এই আচরণটি পেতে পারেন।

উদাহরণস্বরূপ, আপনি যদি এমন কিছু বিদ্যমান বা নাও থাকতে পারে এমন একটি তালিকা মুছে ফেলার চেষ্টা করছেন:

# 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 %

এমনকি এসএনএন আপগ্রেড কোনও উপাদানটিতে ব্যর্থ হলেও প্রক্রিয়া অব্যাহত ছিল


3

আপনি যদি এর xargsসাথে findব্যবহার করে থাকেন তবে পরিবর্তে -execবিকল্পটি ব্যবহার করুন find:

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

1
আপনি কেমন আছেন। আমি এটি ব্যবহার করতে পারি তবে এক্স-এক্সেক অপশনটি এক্সার্গস ব্যবহার করতে পারে এমনভাবে অপারেশনগুলিকে সমান্তরাল করে না এবং করতে পারে
জেডিএস

2
আপনাকে ধন্যবাদ - আমি জানতাম না যে xargsসমান্তরালভাবে কমান্ড চালাতে পারে। কুল। আপনি যদি কেবল কমান্ডের অনুরোধের সংখ্যা হ্রাস করতে চান তবে -execএকটি +প্যারামিটার রয়েছে।
রজার ডাহেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.