tail
ব্লক করে না
সর্বদা হিসাবে: প্রতিটি কিছুর জন্য একটি উত্তর রয়েছে যা সংক্ষিপ্ত, সহজে বোঝা যায়, অনুসরণ করা সহজ এবং সম্পূর্ণ ভুল। এখানে tail -f /dev/null
এই বিভাগে পড়ে;)
আপনি যদি এটির সাথে এটি strace tail -f /dev/null
লক্ষ্য করেন তবে খেয়াল করবেন যে এই সমাধানটি ব্লক করা থেকে দূরে! এটি সম্ভবত sleep
প্রশ্নের সমাধানের চেয়েও খারাপ , কারণ এটি (লিনাক্সের আওতায়) inotify
সিস্টেমের মতো মূল্যবান সংস্থান ব্যবহার করে । এছাড়াও অন্যান্য প্রক্রিয়া যা লুপ /dev/null
তৈরি করতে লিখেন tail
। (আমার উবুন্টু 1664 ১..১০ এ এটি ইতিমধ্যে ব্যস্ত সিস্টেমে প্রতি সেকেন্ডে বেশ কয়েকটি 10 টিस्कেল যুক্ত করেছে))
প্রশ্নটি ছিল একটি ব্লকিং কমান্ডের জন্য
দুর্ভাগ্যক্রমে, এরকম কোনও জিনিস নেই ..
পড়ুন: আমি সরাসরি শেলটি দিয়ে সংরক্ষণাগারভুক্ত করার কোনও উপায় জানি না।
কিছু কিছু (এমনকি sleep infinity
) কিছু সংকেত দ্বারা বাধাগ্রস্ত হতে পারে। সুতরাং আপনি যদি সত্যিই নিশ্চিত হতে চান যে এটি ব্যতিক্রমীভাবে ফিরে না আসে, তবে এটি অবশ্যই একটি লুপে চলবে, যেমনটি আপনি ইতিমধ্যে আপনার জন্য করেছিলেন sleep
। দয়া করে মনে রাখবেন, এটি (লিনাক্সে) /bin/sleep
স্পষ্টতই 24 দিনের মধ্যে ক্যাপড থাকে (একবার দেখুন strace sleep infinity
), সুতরাং আপনি সম্ভবত সেরাটি করতে পারেন:
while :; do sleep 2073600; done
(নোট করুন যে আমি বিশ্বাস করি যে sleep
24 দিনের চেয়ে উচ্চতর মানের জন্য অভ্যন্তরীণভাবে লুপগুলি রয়েছে, তবে এর অর্থ: এটি অবরুদ্ধ নয়, এটি খুব ধীরে ধীরে লুপিং So
.. তবে আপনি নামবিহীন বেশ কাছাকাছি আসতে পারেন fifo
প্রক্রিয়াটিতে কোনও সংকেত প্রেরণ না করা পর্যন্ত আপনি এমন কিছু তৈরি করতে পারেন যা সত্যই অবরুদ্ধ। নিম্নলিখিত ব্যবহার bash 4
, 2 পিআইডি এবং 1 fifo
:
bash -c 'coproc { exec >&-; read; }; eval exec "${COPROC[0]}<&-"; wait'
আপনি strace
যদি এটি পছন্দ করেন তবে সত্যই এটির সাথে বাধা রয়েছে তা আপনি পরীক্ষা করতে পারেন:
strace -ff bash -c '..see above..'
এটি কীভাবে নির্মিত হয়েছিল
read
কোনও ইনপুট ডেটা না থাকলে ব্লক করে (কিছু অন্যান্য উত্তর দেখুন)। তবে, tty
(ওরফে stdin
) সাধারণত কোনও ভাল উত্স নয়, কারণ ব্যবহারকারী লগ আউট করার সময় এটি বন্ধ হয়ে যায়। এছাড়াও এটি থেকে কিছু ইনপুট চুরি করতে পারে tty
। সুন্দর না.
read
অবরুদ্ধ করতে , আমাদের এমন কিছু অপেক্ষা করতে fifo
হবে যা কখনই কিছুই ফেরত না। ইন bash 4
কমান্ড যা ঠিক যেমন একটি সঙ্গে আমাদের প্রদান করতে পারেন আছে fifo
: coproc
। আমরা যদি অবরুদ্ধকরণ read
(যা আমাদের coproc
) অপেক্ষা করি তবে আমাদের কাজ শেষ হয়ে যায়। দু: খজনকভাবে এটি দুটি পিআইডি ও খোলার দরকার fifo
।
নামের সাথে বৈকল্পিক fifo
আপনি যদি নাম ব্যবহার করে বিরক্ত না করেন তবে আপনি নীচের মতো এটি fifo
করতে পারেন:
mkfifo "$HOME/.pause.fifo" 2>/dev/null; read <"$HOME/.pause.fifo"
রিডে একটি লুপ ব্যবহার না করা কিছুটা opালু, তবে আপনি নিজের পছন্দ মতো এটি পুনরায় ব্যবহার fifo
করতে পারেন এবং read
ব্যবহার করে এস টার্মিনেটটি তৈরি করতে touch "$HOME/.pause.fifo"
পারেন (যদি একক পড়ার অপেক্ষা বেশি থাকে, সমস্ত একবারে বন্ধ হয়ে যায়)।
অথবা লিনাক্স pause()
সিস্কেল ব্যবহার করুন
অসীম অবরুদ্ধ করার জন্য একটি লিনাক্স কার্নেল কল রয়েছে pause()
, যা আমরা যা চাই তা করি: চিরকাল অপেক্ষা করুন (কোনও সংকেত না আসা পর্যন্ত)। তবে এটির (এখনও) জন্য কোনও ইউজারস্পেস প্রোগ্রাম নেই।
সি
যেমন একটি প্রোগ্রাম তৈরি করা সহজ। এখানে বলা একটি খুব ছোট লিনাক্স প্রোগ্রাম তৈরি করতে একটি স্নিপেট হয় pause
যা অনির্দিষ্টকালের জন্য একটু থামেন (চাহিদা diet
, gcc
ইত্যাদি):
printf '#include <unistd.h>\nint main(){for(;;)pause();}' > pause.c;
diet -Os cc pause.c -o pause;
strip -s pause;
ls -al pause
python
আপনি যদি নিজের কিছু সংকলন করতে না চান তবে আপনি python
ইনস্টল করেছেন, আপনি এটি লিনাক্সের অধীনে ব্যবহার করতে পারেন:
python -c 'while 1: import ctypes; ctypes.CDLL(None).pause()'
(দ্রষ্টব্য: exec python -c ...
বর্তমান শেলটি প্রতিস্থাপনের জন্য এটি একটি পিআইডি মুক্ত করে some কিছু আইও পুনঃনির্দেশের সাহায্যে অব্যবহৃত এফডি মুক্ত করে সমাধানটি উন্নত করা যেতে পারে This এটি আপনার উপর নির্ভর করে))
এটি কীভাবে কাজ করে (আমি মনে করি): ctypes.CDLL(None)
স্ট্যান্ডার্ড সি লাইব্রেরি লোড করে pause()
এবং এতে কিছু অতিরিক্ত লুপের মধ্যে ফাংশনটি চালায় । সি সংস্করণের চেয়ে কম দক্ষ, তবে কাজ করে।
আপনার জন্য আমার সুপারিশ:
লুপিং ঘুমে থাকুন। এটি বোঝা সহজ, খুব বহনযোগ্য এবং বেশিরভাগ সময় অবরুদ্ধ।