আমি কীভাবে একটি ব্রোকন পাইপ ত্রুটি ঠিক করতে পারি?


36

আমি যখন এসএসডি ড্রাইভ পেয়েছিলাম তখন উবুন্টু ১২.১০-এর একটি নতুন ইনস্টল করার পরে আমি আরভিএম ( http: //rvm.io- র নির্দেশাবলী অনুসরণ করে ) পুনরায় ইনস্টল করেছি।

এখন, যখন আমি টাইপ করি: type rvm | head -1

আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

rvm is a function
-bash: type: write error: Broken pipe

তবে আমি যদি তাত্ক্ষণিকভাবে আদেশটি পুনরাবৃত্তি করি তবে আমি কেবল এটিই পাই:

rvm is a function

এবং দেখা যাচ্ছে সবকিছু ঠিক আছে? কি হচ্ছে? আমি এটি ঠিক করতে কী করতে পারি? এটা সবসময় হয় না। এটি আরও বিক্ষিপ্ত বলে মনে হয়। আমি এটির জন্য কিছু ধরণের সন্ধানের চেষ্টা করেছি কিন্তু এখনও পাইনি।

উত্তর:


57

এই পরিস্থিতিতে "ভাঙা পাইপ" দেখা বিরল, তবে স্বাভাবিক।

আপনি যখন চালান type rvm | head -1, বাশ type rvmএকটি প্রক্রিয়াতে চালিত হয় , head -1অন্য একটিতে। 1 স্ট্যান্ডআউটটি পাইপেরtype "লিখন" প্রান্তের সাথে, "পড়ুন" শেষের স্ট্যান্ডিনের সাথে যুক্ত । উভয় প্রক্রিয়া একই সময়ে চলমান।head

head -1প্রক্রিয়া stdin থেকে (সাধারণত 8 কিলোবাইট অংশ) ডেটা (অনুযায়ী একটি একক লাইন আউট প্রিন্ট সার্চ -1বিকল্প), এবং প্রস্থান করে, যার ফলে পাইপের "পড়া" শেষ বন্ধ করে দেওয়া হয়। যেহেতু rvmফাংশনটি বেশ দীর্ঘ (প্রায় 11 কেবি পার্স এবং ব্যাশ দ্বারা পুনর্নির্মাণের পরে), এর অর্থ এটি থেকে headবেরিয়ে আসে যখন typeএখনও কিছু কেবি ডেটা লেখার জন্য রয়েছে।

এই মুহুর্তে, যেহেতু typeএমন কোনও পাইপে লেখার চেষ্টা করা হচ্ছে যার অন্য প্রান্তটি বন্ধ হয়ে গেছে - একটি ভাঙ্গা পাইপ - এটি যে রাইটিং () ফাংশনটি বন্ধ করেছে এটি একটি "EPIPE ত্রুটি ফিরে আসবে," ব্রোকেন পাইপ "হিসাবে অনুবাদ করা হবে। এই ত্রুটিটি ছাড়াও, কার্নেল এছাড়াও SIGPIPE সিগন্যাল প্রেরণ করে type, যা ডিফল্টরূপে প্রক্রিয়াটিকে তত্ক্ষণাত্ হত্যা করে।

(ইন্টারেক্টিভ শেলগুলিতে সংকেতটি খুব কার্যকর, যেহেতু বেশিরভাগ ব্যবহারকারীরা প্রথম প্রক্রিয়াটি চালিয়ে যেতে এবং কোথাও লেখার চেষ্টা করতে চান না Meanwhile এদিকে, অ-ইন্টারেক্টিভ পরিষেবাগুলি SIGPIPE উপেক্ষা করে - এটি দীর্ঘকাল চলমান ডিমনটির পক্ষে ভাল হবে না) এমন একটি সাধারণ ত্রুটিতে মারা যান - সুতরাং তারা ত্রুটি কোডটি খুব দরকারী বলে মনে করে))

তবে, সংকেত বিতরণ তাত্ক্ষণিকভাবে 100% নয়, এবং এমন কিছু ক্ষেত্রেও দেখা যেতে পারে যেখানে লিখন () ইপিআইপিই ফেরত দেয় এবং সংকেত পাওয়ার আগে প্রক্রিয়াটি অল্প সময়ের জন্য চলতে থাকে। এই ক্ষেত্রে, typeব্যর্থ লেখার লক্ষ্য অনুবাদ ত্রুটি কোড এবং এমনকি SIGPIPE নিহত হওয়ার আগে stderr হবে একটি ত্রুটির বার্তা মুদ্রণ করতে যথেষ্ট সময় পায়। (ত্রুটি বার্তাটি "-বাশ: টাইপ করুন:" যেহেতু typeবাশ নিজেই একটি অন্তর্নির্মিত কমান্ড)

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

typeরাইটিং () ফাংশন থেকে কোনও ইপিআইপিই পাওয়ার সাথে সাথে বিল্টিনকে (ব্যাশের সোর্স কোডে) প্যাচ করে এই বার্তাটি সরিয়ে ফেলা সম্ভব হবে ।

তবে এটি সম্পর্কে উদ্বিগ্ন হওয়ার কিছু নেই এবং এটি কোনওভাবেই আপনার rvmইনস্টলেশন সম্পর্কিত নয় ।


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

আমি আউটপুট বংশীধ্বনিতুল্য হয়েছে lsমাধ্যমে head -1বছর ধরে, এবং আজ আমি একটি ভাঙ্গা পাইপ বার্তা পেয়ে করছি।
তুলাইনস কর্ডোভা

1
(দ্রষ্টব্য: "ভাঙ্গা পাইপ" ত্রুটি সংকেত থেকে আসে না এটা থেকে আসে। Errno শেল অন্যথায় সংকেত ইনডিউসড-প্রস্থানের জন্য লিখিত বার্তা দেখাতে পারে, তাহলেও এটি সাধারণত স্মার্ট যথেষ্ট সাজা করে একটি SIGPIPE প্রস্থান একটি ছিল। 'পরিষ্কার' এক।)
16-24 খ্রিস্টান

23

আপনি একটি ভাঙ্গা পাইপ ঠিক করতে পারবো অন্য প্রক্রিয়ার ব্যয় সন্নিবেশ করার মাধ্যেমে tail -n +1আপনার পাইপে, এভাবে:

টাইপ আরভিএম | লেজ -n +1 | মাথা -1

+1বলে tailইনপুট এবং সবকিছু যে অনুসরণ করে প্রথম লাইন প্রিন্ট করতে। আউটপুট হুবহু tail -n +1হ'ল যেমন ছিল না, তবে প্রোগ্রামটি স্ট্যান্ডার্ড আউটপুট চেক করার জন্য যথেষ্ট স্মার্ট এবং পাইপটি পরিষ্কারভাবে বন্ধ করে দেয়। আর ভাঙা পাইপ নেই


1
দুর্দান্ত কৌশল। আমি এখানে সরবরাহিত অবস্থার চেয়ে আলাদা পরিস্থিতিতে ব্যবহার করেছি। ধন্যবাদ!
এখনও কেউ আপনাকে এমএস-ডস

6
দুর্দান্ত সমাধানের মতো দেখেছি তবে উবুন্টুতে 14.04.2 লেজ 8.21 সহ আমি পেয়েছি "লেজ: লেখার ত্রুটি: ভাঙা পাইপ", যা কোনও উন্নতি নয়।
রজার ডিউক

2
পছন্দ করেছেন একই ধরণের সমস্যার জন্য find /var/lib/mysql -xdev -type f -daystart -mmin +5 -print0 | xargs -0 ls -ldt | tail -n +1 | headনির্ভরযোগ্যভাবে ফলনের জন্য আমি এটি একটি মান্দ্রিভা সিস্টেমে দেখতে পাচ্ছি xargs: ls: terminated by signal 13। যেমনটি আমরা জানি, সমস্যাটি ইনপুট ক্লান্তিগুলির একটি এবং সত্যিই কেবলমাত্র একটি আদেশ রয়েছে যা বাফারিংয়ের সাথে ডিল করে: ডিডি। | dd obs=1Mপাইপলাইনে যুক্ত করা আমার ব্যবহারের ক্ষেত্রে সাইনপিস ঠিক করে।
অ্যান্ড্রু বিلز 21

3
আমি আমার পরামর্শটি আরও সংশোধন করব, যদিও আমি নোট করব যে আমি বিশ্বাস করি না যে সিগারপস বা প্রকারটি সাইনপাইপ সম্পর্কে সন্ধান করা উচিত, এটি: type rvm | (head -1 ; dd of=/dev/null) অবশ্যই, এটি অন্যান্য পরামর্শগুলির সাথে সমান কারণ এর ফলে সমস্ত ইনপুট প্রক্রিয়াজাত হয়? , তবে ddএই জাতীয় জিনিসগুলি পরিচালনা করার জন্য সবচেয়ে দক্ষ প্রোগ্রাম হওয়া উচিত।
অ্যান্ড্রু বিলস

3
এখানে সাইনপাইপ লঙ্ঘনকারীদের ভাষ্য: মেইল-index.netbsd.org/tech-userlevel/2013/01/07/msg007110.html
অ্যান্ড্রু

2

write error: Broken pipeবার্তাটি একটি লেখা প্রক্রিয়া কোনো পাঠকদের পাইপ এবং বিশেষ পরিস্থিতিতে যে পড়া শেষ রেখে দিয়ে একটি নল লিখতে চেষ্টা বোঝায় SIGPIPEসংকেত সেট করা হয় বর্তমান বা পিতা বা মাতা প্রক্রিয়া দ্বারা পারেন উপেক্ষা করা হবে। যদি এটি পিতৃতান্ত্রিক প্রক্রিয়াটিকে SIGPIPEউপেক্ষা করা হয়ে থাকে, তবে শিশু প্রক্রিয়াটিকে আবার কোনও আন্তঃ-ইন্টারেক্টিভ শেলের মধ্যে এটিকে পূর্বাবস্থায় ফিরিয়ে আনা সম্ভব নয়।

যাইহোক, সুস্পষ্ট সাবসেল ব্যবহার করে বন্ধ হয়ে type rvmগেলে হত্যা করা সম্ভব head -1। এইভাবে আমরা ব্যাকগ্রাউন্ড করতে পারি type rvm, সাব typepid- head -1শেলের কাছে প্রেরণ করতে পারি এবং তারপরে স্পষ্টভাবে EXITহত্যা করার জন্য সেখানে একটি ফাঁদ কার্যকর করতে পারি type rvm

trap "" PIPE        # parent process sets SIGPIPE to be ignored
bash                # start child process
export LANG=C
# create a fake rvm function
eval "
rvm() {
$(printf 'echo line of rvm code %s\n' {1..10000})
}
"

# rvm is a function
# bash: type: write error: Broken pipe
type rvm | head -1

# kill type rvm when head -1 terminates
# sleep 0: do nothing but with external command
( (sleep 0; type rvm) & echo ${!} ; wait ${!} ) | 
    (trap 'trap - EXIT; kill "$typepid"; exit' EXIT; typepid="$(head -1)"; head -1)

Grawity এর উত্তর থেকে: typeব্যর্থ লেখার লক্ষ্য অনুবাদ ত্রুটি কোড এবং এমনকি SIGPIPE নিহত হওয়ার আগে stderr হবে একটি ত্রুটির বার্তা মুদ্রণ করতে যথেষ্ট সময় পায় । আমি মনে করি আপনার সমাধানটি প্রযোজক প্রক্রিয়াটিকে ( typeএখানে) ব্যর্থ রাইনের (বন্ধ পাইপের কারণে) প্রতিক্রিয়া দেখাতে বাধা দেয় না , তা কি?
পাইওটর ডব্রোগস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.