বাশ কেন সিগটারটিকে উপেক্ষা করে?


10

কখনও কখনও যখন আমি লগআউট করতে চাই তখন আমি তা করি kill -15 -1। আমি লক্ষ্য করেছি যে ব্যাশ সিগমেন্টারকে উপেক্ষা করছে।

আমি ভাবছি এ জাতীয় বাশ আচরণের যৌক্তিকতা কী ?

কোনও যুক্তিসঙ্গত কারণ নেই যে কোনও ভাল কারণ ছাড়াই সিগিটারটিকে উপেক্ষা করা উচিত, তাই না?

হালনাগাদ:

সবার জন্য একই (না) প্রভাব:

$ kill -TERM $$
$ type kill
kill is a shell builtin
$ command kill -TERM $$
$ /bin/kill -TERM $$

UPDATE2:

ম্যান বাশ থেকে :

যখন বাশ ইন্টারেক্টিভ হয়, কোনও ফাঁদগুলির অনুপস্থিতিতে, এটি SIGTERM উপেক্ষা করে

সুতরাং এটি উদ্দেশ্য অনুযায়ী করা হয়েছে। কিন্তু কেন?


আপনি কোন হত্যার ব্যবহার করছেন? /bin/killনা শেল বিল্টিন? যদি তবে, আমি অনুমান করছি যে শেলটি তার নিজের বিল্টিন দিয়ে নিজেকে হত্যা করবে না।
টেরডন

@ এটারডন: আমি বিল্টিন ব্যবহার করেছি, তবে আমি মনে করি না যে এটি নিজেরাই না খোলার কারণ।
মাইচা erরাজের

1
আপনি যদি দ্রুত লগআউট করতে চান তবে Ctrl + d
YoMismo

1
@ ইয়োমিসমো: "এক্স অধিবেশন থেকে লগআউট"
মাইচা Šরাজার

2
@ মাইচারাজার: সিআরটিএল-অল্ট-ব্যাকস্পেস আমার পক্ষে এই জর্গে ... এটি আপনাকে xorg.conf এ সক্ষম করতে হতে পারে, যদিও।
লাস্লোলো ভালকো

উত্তর:


10

প্রথমত, এটি ব্যাশের জন্য নির্দিষ্ট নয়। এটিটি কেএসএস, ড্যাশ এবং জেডএস একইভাবে আচরণ করে: তারা কমান্ড লাইন সংস্করণের সময় SIGTERM এবং SIGQUIT উপেক্ষা করে; মিক্স হিসাবে, এটিও প্রস্থান করে না তবে তাদের সাথে সাইন্টের মতো আচরণ করে।

Ksh ম্যানুয়াল এবং ব্যাশ ম্যানুয়াল উভয়ই এই শর্তগুলিতে SIGTERM উপেক্ষা করার ন্যায়সঙ্গত:

যাতে এটি kill 0একটি ইন্টারেক্টিভ শেলকে হত্যা করে না

kill 0শেলটি যে প্রক্রিয়া গোষ্ঠীতে রয়েছে তাতে সমস্ত প্রক্রিয়া মেরে ফেলে ¹ সংক্ষেপে, প্রক্রিয়া গ্রুপটি টার্মিনালের সম্মুখভাগে চলমান সমস্ত প্রক্রিয়া, বা একটি ব্যাকগ্রাউন্ডে বা স্থগিত কাজের সমস্ত প্রক্রিয়া সমন্বিত করে।

আরও স্পষ্টভাবে, কাজ নিয়ন্ত্রণের সাথে আধুনিক শেলগুলিতে এটি ঘটে । এই ধরনের শেলগুলিতে, kill 0দরকারী হবে না, কারণ শেলটি তার নিজস্ব একটি প্রক্রিয়া গোষ্ঠীতে থাকবে। পুরানো শেলগুলি (বা পরে আধুনিক শেলগুলি set +m) ব্যাকগ্রাউন্ড কমান্ডগুলির জন্য প্রক্রিয়া গ্রুপ তৈরি করে না। আপনি কমান্ড ব্যবহার করতে পারে তাই kill 0out.² লগ এভাবে পেয়ে ছাড়া সব পটভূমি কমান্ড হত্যা করার kill 0একটি পুরানো এক যা আর আজকাল সমর্থনযোগ্য কিন্তু অনুন্নত সহাবস্থানযোগ্যতা জন্য রাখা মত যুক্তিপূর্ণ সৌন্দর্য।

তবে অন্যান্য অনুরূপ পরিস্থিতি রয়েছে যেখানে শেল প্রতিরোধ ক্ষমতা তৈরি করা কার্যকর। আপনি যেখানে টার্মিনালকে হাগিং করার প্রক্রিয়াগুলি দেখেন সে ক্ষেত্রে বিবেচনা করুন এবং লগ আউট না করে আপনি তাদের হত্যা করতে চান। অনেক সিস্টেমে এমন একটি সরঞ্জাম থাকে pkillযা আপনাকে টার্মিনালে চলমান প্রক্রিয়াগুলি মেরে ফেলতে দেয়। আপনি বর্তমান টার্মিনালে চলমান সমস্ত প্রক্রিয়া চালাতে pkill -t $TTYবা pkill -QUIT -t $TTYহত্যা করতে পারেন , শেলটি বাদ দিয়ে যা সিগন্যালটিকে উপেক্ষা করে।

শেলটি সাধারণত ব্যবহারকারী দূরে চলে যায় যখন ব্যবহারকারী এটি থেকে বেরিয়ে আসে (যেমন একটি কমান্ড সহ exitবা এর সাহায্যে logout), বা যখন এর টার্মিনালটি ইনপুটটির শেষের সিগন্যাল দেয় (ব্যবহারকারী Ctrl+ টিপে এটির কারণ হতে পারে D) বা সম্পূর্ণভাবে চলে যায়। এই শেষ ক্ষেত্রে, শেলটি সিগন্যাল SIGHUP গ্রহণ করে এবং এটি সেটিকে অগ্রাহ্য করে না।

এক্স সেশন থেকে লগ আউট করার ক্ষেত্রে আপনার ব্যবহারের ক্ষেত্রে kill -15 -1এটি সম্পন্ন হবে, কারণ এটি টার্মিনাল এমুলেটরটিকে হত্যা করে যার ফলে শেলটি SIGHUP গ্রহণ করে। এটি এক্স সার্ভারকে হত্যা করার পক্ষে যথেষ্ট, তবে এটির জন্য এটির প্রসেস আইডি খুঁজে পাওয়া দরকার। আপনি যদি একই কমান্ডটি কোনও পাঠ্য সেশনে কাজ করতে চান তবে আপনি এটি ব্যবহার করতে পারেন kill -15 -1; exit। যাইহোক আপনার নখদর্পণে থাকা এটি বেশ বিপজ্জনক আদেশ।

¹ এই নিয়ম হিসাবে শেল ম্যানুয়াল উল্লেখ হবে বলে মনে হচ্ছে না; এটি অন্তর্নিহিত সিস্টেম কলের একটি বৈশিষ্ট্য। এটি POSIX স্পেসিফিকেশন স্পষ্টভাবে উল্লেখ করা হয় ।
Adays আজকাল, এটি করার জন্য, তাদের প্রসেস গ্রুপ আইডি সহ কাজের তালিকাগুলি চালনা করুন jobs -l, তারপরে kill -123 -456 …প্রক্রিয়া গোষ্ঠীগুলিকে হত্যা করুন।


5

এটি আপনার প্রশ্নের উত্তর দিতে পারে:

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

বাশ দ্বারা শুরু করা নন-বিল্টিন কমান্ডগুলির সিগন্যাল হ্যান্ডলারগুলি তার পিতামাতার কাছ থেকে শেলের দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত মানগুলিতে সেট থাকে। যখন কাজের নিয়ন্ত্রণ কার্যকর না হয়, অ্যাসিঙ্ক্রোনাস কমান্ডগুলি উত্তরাধিকার সূত্রে প্রাপ্ত এই হ্যান্ডলারগুলি ছাড়াও SIGINT এবং SIGQUIT উপেক্ষা করে। কমান্ড প্রতিস্থাপনের ফলস্বরূপ কমান্ডগুলি চালিত কীবোর্ড-উত্পাদিত চাকরি নিয়ন্ত্রণ সংকেতগুলি সিগটিটিন, সিগটো এবং সিগস্টটিপি উপেক্ষা করে।

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

যদি হুপোনেক্সিট শেল বিকল্পটি শাপ্টের সাথে সেট করা থাকে (দ্য শপ্ট বিল্টিন দেখুন), একটি ইন্টারেক্টিভ লগইন শেলটি প্রস্থান করার পরে বাশ সমস্ত চাকরিতে সাইনআপ পাঠায়।

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

উত্স : জিএনইউ বাশ ম্যানুয়াল


আমি আমার আপডেট 2 এ উদ্ধৃত করেছি। ম্যান বলেছেন যে বাশ তা করছে, কিন্তু কেন এমন সিদ্ধান্ত তা ব্যাখ্যা করে না। প্রশ্ন থেকে যায় - কেন?
মিশা আরাজের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.