এক থেকে অন্য প্রক্রিয়াতে পাইপযুক্ত বাইট সংখ্যা গণনা করুন


17

আমি একটি শেল স্ক্রিপ্ট চালাচ্ছি যা এক প্রক্রিয়া থেকে অন্য প্রক্রিয়াতে ডেটা পাইপ করে

process_a | process_b

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

process_a | count_bytes | process_b

কারও কি খুব সুন্দর সমাধান আছে?

উত্তর:


16

পাইপ মাধ্যমে ডিডি। ডিডির ডিফল্ট ইনপুটটি স্টিডিন এবং ডিফল্ট আউটপুটটি স্টডআউট; যখন এটি স্টিন / স্টাডাউট আই / ও শেষ করে, এটি স্টাডারের কাছে এটি ডেটা স্থানান্তরিত করার বিষয়ে রিপোর্ট করবে।

আপনি যদি ডিডির আউটপুট ক্যাপচার করতে চান এবং অন্যান্য প্রোগ্রামগুলি ইতিমধ্যে স্ট্যাডারের সাথে কথা বলে, তবে অন্য একটি ফাইল-বর্ণনাকারী ব্যবহার করুন। যেমন,

$ exec 4>~/fred
$ input-command | dd 2>&4 | output-command
$ exec 4>&-

2
আপনি execসরাসরি এড়িয়ে যেতে পারেন নি কেবল ফাইলটিতে আউটপুট? input-command | dd 2>~/fred | output-command
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

2
হুঁ। আপাতদৃষ্টিতে আমার "সেই" মুহুর্তগুলির মধ্যে একটি ছিল, দুঃখিত।
ফিল পি

28

পাইভ ভিউয়ার পিভি ব্যবহার করুন । এটি একটি দুর্দান্ত সরঞ্জাম। একবার আপনি এটি সম্পর্কে জানার পরে আপনি কখনই জানতে পারবেন না যে আপনি এটি ছাড়া কীভাবে বেঁচে ছিলেন।

এটি আপনাকে অগ্রগতি বার এবং স্থানান্তরের 'গতি'ও দেখাতে পারে।


আমার অনুসন্ধানে আমি এটির পক্ষে এসেছি, তবে স্থানান্তরিত বাইটের সংখ্যার সাথে আমার একটি ভেরিয়েবল সেট করা দরকার যাতে আমি এটি অন্য প্রক্রিয়াতে ব্যবহার করতে পারি।
সাইমন হজসন

ব্যবহারের উদাহরণ: cat file | pv -bফাইলের আকার ফিরিয়ে দেবে।
রডর্গাস

6

process_a | tee >(process_b) | wc --bytesকাজ করতেও পারে. তারপরে wcআপনি যেখানে প্রয়োজন সেখানে তার গণনা পুনর্নির্দেশ করতে পারেন । যদি process_bকিছু stdout/ আউটপুট দেয় তবে stderrআপনার সম্ভবত এটি অন্য কোনও জায়গায় পুনর্নির্দেশ করতে হবে, যদি তবেই /dev/null

কিছুটা স্বীকৃত উদাহরণের জন্য:

filestore:~# cat document.odt | tee >(dd of=/dev/null 2>/dev/null) | wc --bytes
4295

ব্যাখ্যার মাধ্যমে: teeআপনি একাধিক ফাইলের (আউট স্টাডাউট) আউটপুটকে সরাসরি নির্দেশ করতে পারবেন এবং >()কনস্ট্রাক্ট হ'ল বাশের "প্রক্রিয়া বিকল্প" যা এই ক্ষেত্রে প্রসেসকে কেবল লেখার ফাইলের মতো দেখায় যাতে আপনি প্রক্রিয়াগুলির পাশাপাশি ফাইলগুলিতে পুনঃনির্দেশ করতে পারেন ( অনেক প্রক্রিয়াতে আউটপুট প্রেরণে ব্যবহার করার উদাহরণের জন্য এখানে দেখুন বা এই প্রশ্নটি + উত্তর দেখুনtee )।


আমি এই সমাধানটি পছন্দ করি, দুঃখের সাথে আমি যে শেলটি ব্যবহার করছি (ব্যাসিবক্স)> (()) স্বরলিপি সমর্থন করে না, তবে এটি আমার পরে যা করার একটি উপায় সরবরাহ করে।
সাইমন হজসন

হ্যাঁ, সেই বৈশিষ্ট্যটির জন্য আপনার একটি সুন্দর সম্পূর্ণ বাশ দরকার - এটি এমন এক ধরণের জিনিস যা সাধারণত ব্যবহৃত হয় না তাই কাটা ডাউন শেলগুলি ছিঁড়ে যায় (এমনকি আরও বা কম বাশ সামঞ্জস্যপূর্ণ হওয়ার লক্ষ্যযুক্ত ব্যক্তিরাও) স্থান বাঁচাতে ব্যস্তবক্সের মতো।
ডেভিড স্পিললেট

1

আমি জানি আমি পার্টিতে দেরি করেছি, তবে আমি বিশ্বাস করি আমার কাছে একটি ভাল উত্তর আছে যা এই দরকারী থ্রেডকে বাড়িয়ে তুলতে পারে।
এটি @ ফিল পি এবং @ ডেভিড স্পিললেট উত্তরের মিশ্রণ, তবে:

  • @ ফিল পি এর থেকে আলাদাভাবে, এটি একটি নতুন ফাইল তৈরি করা এড়িয়ে চলে
  • @ ডেভিড স্পিলিটের থেকে আলাদাভাবে, এটি পাইপলাইন কাঠামোটি বজায় রাখে

প্রসেস_বি এর যে কোনও আউটপুট সহ বাইটস-কাউন্ট স্টাডাউটে মুদ্রণ করা হয়।
আউটপুট ( Bytes:উদাহরণস্বরূপ) এর সাথে কাজ করার সময় বাইটযুক্ত লাইনটি সনাক্ত করতে আপনি একটি উপসর্গ ব্যবহার করতে পারেন ।

exec 3>&1
process_a | tee >({ echo -n 'Bytes:'; wc -c; } >&3) | process_b
exec 3>&-

সতর্কতা:
আউটপুটে লাইনের ক্রমের উপর নির্ভর করবেন না ক্রমটি
অনির্দেশ্য এবং একই প্যারামিটারগুলির সাথে একই স্ক্রিপ্টটি কল করার সময়ও এটি সর্বদা পৃথক হতে পারে!


দুঃখের বিষয়, এটি এখনও কেবলমাত্র একমাত্র নির্মাণ ...
মিখাইল টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.