একাধিক প্রক্রিয়া থেকে খারাপভাবে আউটপুট মার্জ করা থেকে জার্গস কীভাবে থামানো যায়?


17

আমি xargsবিকল্পটি ব্যবহার করছি --max-args=0(বিকল্পভাবে -P 0)।

যাইহোক, প্রক্রিয়াগুলির আউটপুট stdoutযথাযথ লাইন বিভাজন বিবেচনা না করে প্রবাহে একীভূত করা হয় । সুতরাং আমি প্রায়শই এর মতো লাইন দিয়ে শেষ করব:

<start-of-line-1><line-2><end-of-line-1>

আমি ব্যবহার করছি হিসাবে egrepসঙ্গে ^পুরো আমার প্যাটার্ন xargsআউটপুট এই আমার রেজাল্ট আপ তালগোল পাকানো হয়।

xargsপ্রক্রিয়া আউটপুটগুলি ক্রমানুসারে লিখতে বাধ্য করার কোনও উপায় আছে (কোনও ক্রম, যতক্ষণ না একটি প্রক্রিয়ার আউটপুটটি সামঞ্জস্যপূর্ণ)?

নাকি অন্য কোন সমাধান?

সম্পাদনা করুন: ব্যবহারের ক্ষেত্রে আরও বিশদ:

আমি বিভিন্ন হোস্ট থেকে ওয়েব পৃষ্ঠাগুলি ডাউনলোড এবং বিশ্লেষণ করতে চাই। প্রতিটি পৃষ্ঠা লোড হতে প্রায় এক সেকেন্ড সময় নেয় এবং কয়েক ডজন পৃষ্ঠাগুলি আমি অনুরোধগুলিকে সমান্তরাল করতে চাই।

আমার কমান্ডের নিম্নলিখিত রূপ রয়েছে:

echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
wget -q -O- http://{}/somepage.html | egrep --count '^string'

আমি ব্যাশ ব্যবহার করি এবং পার্লের মতো কিছু না কারণ হোস্ট আইপি ($ আইপি ভেরিয়েবল) এবং কিছু অন্যান্য ডেটা একটি অন্তর্ভুক্ত ব্যাশ ফাইল থেকে আসে।


আপনি কি আপনার প্রশ্নের আরও একটি সম্পূর্ণ উদাহরণ করতে পারেন? আপনি বর্তমানে কীভাবে বা কেন ব্যবহার করছেন তা পরিষ্কার নয় xargs
কালেব

এর সমাধানটি শক্ত হবে, প্রতিটি প্রসেসের স্টডআউটের জন্য পৃথক ফাইল বর্ণনাকারী ব্যবহার করতে হবে এবং লাইনগুলি সংগ্রহ করতে একটি ছোট সার্ভার ব্যবহার করতে হবে। xargsএমন কোনও বৈশিষ্ট্য সরবরাহ করে বলে মনে হচ্ছে না।
স্টাফেন গিমেনেজ

@ কালেব আপনি সেখানে যান, আশা করি এটি সাহায্য করে :-)
ক্রিস্টোফ উর্ম

অবশ্যই কোনও হালকা ওজনের সমাধান নয়, তবে সম্ভবত আপনি এটি ব্যবহার করতে পারেন make চাকরির বৈশিষ্ট্যটি , আমি মনে করি makeআউটপুট লাইনগুলি সঠিকভাবে মার্জ করে।
স্টাফেন গিমেনেজ

সাহায্যের জন্য --line-bufferedপতাকা যুক্ত করছেegrep
8-15

উত্তর:


6

এই কৌতুক করতে হবে:

echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
  sh -c "wget -q -O- 'http://{}/somepage.html' | egrep --count '^string'" | \
  { NUM=0; while read i; do NUM=$(($NUM + $i)); done; echo $NUM; }

এখানে ধারণাটি পৃথক গণনা করা এবং শেষে এগুলি যোগ করা। পৃথক গণনাগুলি মেশানোর জন্য যথেষ্ট বড় হলে ব্যর্থ হতে পারে, তবে এটি হওয়া উচিত নয়।


14

এই সমস্যাটি সমাধানের জন্য জিএনইউ সমান্তরাল সুনির্দিষ্টভাবে তৈরি করা হয়েছে:

echo -n $IPs | parallel -d ' ' -j0 wget -q -O- http://{}/somepage.html | egrep --count '^string'

যদি আপনার আইপিগুলি কোনও ফাইলে থাকে তবে এটি আরও সুন্দর:

cat IPs | parallel -j0 wget -q -O- http://{}/somepage.html | egrep --count '^string'

আরও জানতে ইন্ট্রো ভিডিওটি দেখুন: http://www.youtube.com/watch?v=OpaiGYxkSuQ


2
দুর্দান্ত সরঞ্জাম! এছাড়াও, আমি বাজি দিচ্ছি যে কেউ আপনাকে বলবে যে খুব শীঘ্রই বিড়াল অকেজো।
স্টাফেন গিমেনেজ

1
আমি জানি. তবে আমি এটি পড়তে সহজ বলে মনে করি এবং আমি সাধারণত ৪৮ টি মূল মেশিনে কাজ করি, তাই নিষ্ক্রিয় কোরগুলির জন্য কয়েকটি অতিরিক্ত ঘড়ির চক্র এখনও কোনও সমস্যা হতে পারে না।
ওলে টাঞ্জ

সমান্তরাল কাজের জন্য উপযুক্ত হবে যদি এটি ডেবিয়ান সংগ্রহস্থলে থাকে।
ক্রিস্টোফ উর্মটি

1
@Legate ডেবিয়ান অন্তর্ভুক্ত parallelথেকে কমান্ড moreutils এখানে, যা যথেষ্ট;parallel -j99 -i sh -c 'wget -q -O- http://{}/somepage.html | egrep -c "^string"' -- $IPs
গিলেজ 'SO- স্টপ হচ্ছে মন্দ'

@ লেবেট চেকআউট build.opensuse.org/package/… একটি .deb ফাইলের জন্য এবং বাগটি ধাক্কা দেওয়ার জন্য bugs.debian.org/cgi-bin/bugreport.cgi?bug=518696
ওলে টেঞ্জ 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.