ইউনিক্স / লিনাক্সে বাফার না করে কোনও ফাইলে আউটপুট পুনর্নির্দেশ করার কোনও উপায় আছে কি?


49

আমার একটি দীর্ঘ চলমান ব্যাচ প্রক্রিয়া রয়েছে যা স্টাবআউটে কিছু ডিবাগ এবং প্রক্রিয়া সম্পর্কিত তথ্যকে আউটপুট করে। আমি যদি কেবল কোনও টার্মিনাল থেকে চালিত করি তবে আমি 'এটি কোথায়' এর ট্র্যাক রাখতে পারি তবে ডেটা খুব বেশি হয়ে যায় এবং স্ক্রিন থেকে স্ক্রোল হয়।

যদি আমি কোনও ফাইল '> আউট.টিএসটিএল' এ আউটপুটটিতে পুনঃনির্দেশ করি তবে শেষ পর্যন্ত আমি পুরো আউটপুট পাই তবে এটি বাফার হয়ে গেছে তাই এখনই এটি আর কী করছে তা দেখতে পাচ্ছি না।

আউটপুট পুনর্নির্দেশ করার কিন্তু এটির লেখার বাফার না করার কোনও উপায় আছে কি?


1
আপনি দয়া করে নীচে আমার (এবং @ সিএনএসটির) "বিতর্ক" একবার দেখে নিতে পারেন, আমি অনুমান করছি যে আপনি চান কেবলমাত্র একই সময়ে আউটপুটটিকে কোনও ফাইলে লগ করার মতো দেখতে পাওয়া যায়। যদি আপনি কোনও সমাধান খুঁজে পান তবে আসুন এটি সম্পর্কে আমাদের জানুন;)!
বেঞ্জ

উত্তর:


52

আপনি setvbufসি তে একটি কল ব্যবহার করে স্ট্যান্ডার্ড স্ট্রিমগুলির বাফারিং বিকল্পগুলি স্পষ্টভাবে সেট করতে পারেন ( এই লিঙ্কটি দেখুন ) তবে আপনি যদি কোনও বিদ্যমান প্রোগ্রামের আচরণটি পরিবর্তন করার চেষ্টা করছেন তবে stdbuf( coreutilsদৃশ্যত 7.৫ সংস্করণ দিয়ে শুরু করার অংশ ) চেষ্টা করুন।

এটি stdoutএকটি লাইনে বাফার করে:

stdbuf -oL command > output

এটি stdoutপুরোপুরি বাফারিং অক্ষম করে:

stdbuf -o0 command > output

আআরহঃহ ... আমার উবুন্টুতে মাত্র 7.4
কোর্টিল রয়েছে

@ ক্যালমারিয়াস: কোর্টিলগুলি সংকলন করা খুব সহজ হওয়া উচিত। Ftp.gnu.org/gnu/coreutils থেকে কেবল একটি নতুন সংস্করণ দখল করুন এবং এটিকে দেখুন। এটা স্ট্যান্ডার্ড ./configure && makeভাড়া। আপনার পরে এটি ইনস্টল করতে হবে না, আপনি কেবল stdbufবাইনারি বন্ধ ব্যবহার করতে পারেন src/
এডুয়ার্ডো ইভানেক

ডাবল আর্গ আমার এটি পুরানো সেন্টো ডিস্ট্রো এবং ওএসএক্স পাশাপাশি উবুন্টুতে দরকার।
edk750


ইতিমধ্যে পরিচিত পিআইডি দিয়ে প্রক্রিয়া চালানোর জন্য বাহ্যিকভাবে পাইপ / প্রিন্টফ বাফারদের জোর করার কোনও উপায় আছে কি?
মুভেরিসেক

9

আপনি scriptযেমন কমান্ডটি ব্যবহার করে কোনও ফাইলে লাইন বাফার আউটপুট অর্জন করতে পারেন:

stty -echo -onlcr   # avoid added \r in output
script -q /dev/null batch_process | tee output.log        # Mac OS X, FreeBSD
script -q -c "batch_process" /dev/null | tee output.log   # Linux
stty echo onlcr

-১ কারণ: ক) স্বীকৃত উত্তরের বিপরীতে আপনি কাজ করে না যদি আপনি পটভূমিতে কমান্ডটি চালাতে চান (কমান্ডটি অবিলম্বে শেষ না করেই batch_processযদি আপনি &উপরের কমান্ডের সাথে যুক্ত হন তবে আমার লিনাক্স বাক্সে অন্তত অন্তর্ভুক্ত), যা মনে হয় একটি অত্যন্ত সাধারণ ব্যবহারের ক্ষেত্রে, এবং খ) এই প্রসারণটি কীভাবে কাজ করে তার কোনও ব্যাখ্যা এখানে নেই।
মার্ক আমেরিকা

8

উবুন্টুতে, unbufferপ্রোগ্রামটি ( expect-devপ্যাকেজ থেকে ) আমার জন্য কৌশলটি করেছে। শেষ ঘন্টা:

unbuffer your_command

এবং এটি এটি বাফার করবে না।


6

সবচেয়ে সহজ সমাধান যা আমি পেয়েছি (কোনও তৃতীয় পক্ষের প্যাকেজ ইনস্টল করা দরকার ছিল না) ইউনিক্স এবং লিনাক্স সাইটে একই ধরণের উল্লেখ করা হয়েছিল : scriptকমান্ডটি ব্যবহার করুন । এটি পুরানো, এবং সম্ভবত ইতিমধ্যে ইনস্টল করা আছে।

$ script -q /dev/null long_running_command | print_progress       # FreeBSD, Mac OS X
$ script -q -c "long_running_command" /dev/null | print_progress  # Linux

নোট করুন যে কমান্ডের জন্য প্রথম ফাইলের পরামিতিটি scriptহ'ল লগ ফাইল । আপনি যদি সহজভাবে চালান script -q your_command, আপনি লগ ফাইলটি দিয়ে চালনার জন্য যে কমান্ডটি লিখেছেন সেগুলি ওভাররাইট করবেন। man scriptচেষ্টা করে দেখুন , নিরাপদ থাকতে, পরীক্ষা করুন ।


4

scriptকমান্ড চেষ্টা করুন ; যদি আপনার সিস্টেমে এটি থাকে তবে এটি ফাইলের নাম হিসাবে যুক্তি হিসাবে নেয়, স্ট্যাডআউটে ফেলে দেওয়া সমস্ত পাঠ্য ফাইলটিতে অনুলিপি করা হয়। এটি খুব কার্যকর যখন কোনও সেটআপ প্রোগ্রামের ইন্টারঅ্যাকশন প্রয়োজন।


আমি 'স্ক্রিপ্ট -a আউট টেক্সট' কৌশল সম্পর্কে জানি। আমি ভাবছিলাম লেখার প্রক্রিয়াটি বাফার না করে অন্য কোনও উপায় আছে কিনা।
জেমস ডিন

3

ব্যক্তিগতভাবে আমি যে কমান্ডটি দিয়ে পরীক্ষা করতে চাই তার পাইপিং আউটপুট পছন্দ করি tee

scriptকী প্রেসগুলির সময়সীমা এবং প্রচুর অ-মুদ্রণযোগ্য অক্ষর সহ অনেক বেশি তথ্য রেকর্ড করে। যা teeবাঁচায় তা আমার পক্ষে অনেক বেশি পাঠযোগ্য।


আমি কমান্ড লাইনে "| কম" যুক্ত করব।
হাব

4
আমি নিশ্চিত যে teeএটি বাফারিং দ্বারাও প্রভাবিত হয়েছে। findকমান্ডগুলি থেকে আউটপুট বিভক্ত করার সময় আমি প্রায়শই টি দ্বারা আংশিক লাইনগুলি প্রদর্শন করি ।
ম্যাগেলান

2

আউটপুটটিকে কোনও ফাইলে পুনর্নির্দেশ করুন এবং tail -fকমান্ড দিয়ে ফাইলটি অনুসরণ করুন ।

সম্পাদন করা

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


3
এই মুহুর্তে আমি এটিই করি তবে প্রক্রিয়াটি ফাইলটিতে লেখার লেখার পক্ষে কাজ করে এবং এটিই আমি এড়াতে চাই।
জেমস ডিন

একটি আপডেট প্রস্তাব জন্য আমার সম্পাদনা দেখুন।
ওল্ফগ্যাঞ্জস

1
এটি সুস্পষ্ট কারণে কাজ করে না। কে This answer is usefulকাজ করে না এবং সম্ভবত কাজ করতে পারে না এমন উত্তরগুলির জন্য কে দেয় ?
সিএনএসটি

1

আপনি teeকমান্ডটি ব্যবহার করতে পারেন , কেবল যাদু!

someCommand | tee logFile.logউভয় কনসোলে প্রদর্শিত হবে এবং লগ ফাইলে লিখবে।


কাজ করে না। teeকোনও বাফারিংয়ের ঘটনা ঘটবে না।
সিএনএসটি

1
@ সিএনএসটি কার্যকরভাবে teeকিছু বাফারিং এড়াবে না তবে আউটপুট কী তা আপনাকে কেবল একবার দেখার সুযোগ দেবে। @ জেমসডিয়ান এটিই চেয়েছিলেন (আমি যেমন তাঁর প্রশ্নটি পূর্বেই ফেলেছিলাম) তবে আমি মনে করি যে এখানে বাফারিং আসলে সমস্যা নয়। আপনার যদি আরও বিশদ থাকে তবে আমাকে জানান।
বেঞ্জ

তিনি আউটপুটটি দেখতে চেয়েছিলেন, এবং তিনি কোনও আউটপুট পাচ্ছেন না (আনফার্ডড পদ্ধতিতে) এবং তবুও আপনি teeযে আউটপুটটি পাচ্ছেন না তাতে আরও ভাল দৃশ্য পেতে ব্যবহার করার পরামর্শ দিয়েছেন ?
সিএনএসটি

1
আমি কীভাবে জেমসডিয়ান প্রশ্নটি লাল করেছি: "আমি কোনও ফাইল '> আউট.টেক্সট' এ আউটপুট থেকে পুনঃনির্দেশ করি" তার অর্থ আমার পক্ষে কোনও কনসোল আউটপুট নেই, পুরো আউটপুট পুনঃনির্দেশিত হওয়ার সময় প্রক্রিয়াটি শেষ হওয়ার জন্য অপেক্ষা করুন। আপনি যখন ব্যবহার করছেন তখন >কনসোলে কিছুই দেখতে পাবেন না। আমার ধারণা, জেমসডিয়ান এটি বর্ণনা করতে "বাফারিং" শব্দটি ব্যবহার করছেন। আমি তার প্রশ্নের উপর একটি মন্তব্য পোস্ট করব যাতে সে কী চায় সে সম্পর্কে আরও বলতে হবে।
বেঞ্জ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.