আমি কেন একটি সিএসজিআরটিএম দিয়ে একটি SIGSTOP'd প্রক্রিয়াটি হত্যা করতে পারি না এবং মুলতুবি থাকা সংকেতটি কোথায় সংরক্ষণ করা হয়?


24

আমি ডেবিয়ান স্ট্রেচ (সিস্টেমড) ব্যবহার করছি। আমি ফোরগ্রাউন্ড এ rsyslog- ডেমন চলমান ছিল ব্যবহার /usr/sbin/rsyslogd -n এবং আমি একটি করেনি Ctrl+ + Zএটা বন্ধ করার। প্রক্রিয়াটির স্থিতি Tl(থামানো, থ্রেডযুক্ত) এ পরিবর্তিত হয়েছে । আমি একাধিক জারি প্রক্রিয়া আদেশ, এবং প্রক্রিয়া রাজ্যের সাথে মিলে গেছে: । একবার আমি একটি করলাম , এটি মারা গেল। আমার 3 টি প্রশ্ন আছে।kill -15 <pid>Tlfg

  • কেন SIGSTOP-ed প্রক্রিয়াটি সাড়া দিচ্ছিল না SIGTERM? কার্নেল এটিকে একই অবস্থায় রাখে কেন?
  • SIGCONTসংকেত পাওয়ার মুহুর্তে কেন এটি খুন হল ?
  • এটি যদি পূর্ববর্তী SIGTERMসিগন্যালের কারণে হয়, প্রক্রিয়াটি পুনরায় শুরু না হওয়া পর্যন্ত এটি কোথায় রাখা হয়েছিল?

উত্তর:


41

SIGSTOPএবং SIGKILLদুটি সিগন্যাল যা কোনও প্রক্রিয়া দ্বারা ধরা ও পরিচালনা করা যায় না। SIGTSTPভালো হয় SIGSTOPব্যতীত এটি করতে কট অ্যান্ড পরিচালনা করা।

SIGSTOPএবং SIGTSTPসংকেত তার গানগুলি একটি প্রক্রিয়া বন্ধ জন্য প্রস্তুত SIGCONT। আপনি যখন সেই প্রক্রিয়াটিকে প্রেরণ করেন, প্রক্রিয়াটি SIGTERMচলছে না এবং তাই এটি প্রস্থান করার জন্য কোড চালাতে পারে না।

(এছাড়াও রয়েছে SIGTTINএবং SIGTTOUএটি টিটিওয়াই স্তর দ্বারা উত্পন্ন সিগন্যাল যখন একটি পটভূমি কাজ টার্মিনালে পড়তে বা লিখতে চেষ্টা করে They তারা ধরা পড়তে পারে তবে অন্যথায় প্রক্রিয়াটি স্থগিত করে দেয়) ঠিক তেমনই SIGTSTP। তবে আমি এখন যাচ্ছি এই উত্তরটির অবশিষ্টাংশের জন্য এই দুজনকে উপেক্ষা করুন))

আপনার CtrlZপ্রক্রিয়াটি একটি প্রেরণ করে SIGTSTPযা কোনওভাবেই বিশেষভাবে পরিচালিত হয় না বলে মনে হয় rsyslogd, তাই এটি প্রক্রিয়াটি স্থগিত SIGCONTবা স্থগিত করে SIGKILL

সমাধানটি SIGCONTআপনার পরে প্রেরণ করা SIGTERMযাতে প্রক্রিয়াটি সংকেতটি গ্রহণ করতে ও পরিচালনা করতে পারে।

উদাহরণ:

sleep 999 &

# Assume we got PID 456 for this process
kill -TSTP 456    # Suspend the process (nicely)
kill -TERM 456    # Terminate the process (nicely). Nothing happens
kill -CONT 456    # Continue the process so it can exit cleanly

জিএনইউ সি লাইব্রেরির জন্য ডকুমেন্টেশন এটি বেশ ভালভাবে ব্যাখ্যা করেছে, আমার মনে হয় (আমার হাইলাইট করা):

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


1
@nohup। উত্তরটি প্রসারিত হয়েছে, তবে মূলত, "হ্যাঁ; এটি kill -15আপনি ইতিমধ্যে প্রেরণ করেছিলেন তা পরিচালনা করেছে "।
রোয়াইমা

2
@ নোহপ হ্যাঁ, ডকুমেন্টেশন অনুসারে: a প্রক্রিয়াটি বন্ধ হয়ে যাওয়ার পরে এটি চালিয়ে যাওয়া পর্যন্ত আর কোনও সংকেত সরবরাহ করা যায় না ... সংকেতগুলি মুলতুবি হিসাবে চিহ্নিত হয়েছে, তবে প্রক্রিয়াটি অব্যাহত না হওয়া পর্যন্ত বিতরণ করা হয় না। »
রোয়াইমা

1
সিগটিন এবং সিগটুও দেখুন যা প্রক্রিয়াগুলিও বন্ধ করে দেয়
স্টাফেন চেজেলাস

1
@ স্টাফেনচাজেলাস ভাল পয়েন্ট। আমি এগুলির উল্লেখ যোগ করেছি তবে অন্যথায় সেগুলি উপেক্ষা করেছি। আপনি উপযুক্ত হিসাবে দেখুন সম্পাদনা করুন নির্দ্বিধায়।
রোয়াইমা

2
@coteyr। আমি দ্বিমত পোষণ করছি: SIGKILLকোনও অ্যাপ্লিকেশন পরিষ্কার হওয়া থেকে বাধা দেয়, তাই SIGTERMঅনেক (সর্বাধিক) ক্ষেত্রে ব্যবহার করা আরও ভাল।
রোয়াইমা

9

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

তত্ত্ব অনুসারে, পদ্ধতিটি জানতে পারে যে প্রক্রিয়াটির জন্য একটি সিগন্যাল হ্যান্ডলার ইনস্টল করা আছে SIGTERMএবং যদি তা না করে তা অবিলম্বে বন্ধ করে দেয়। কিন্তু (যেমন গিলেজ 'মন্তব্য প্রতি) POSIX দাবী করে যে সংকেত পর্যন্ত প্রক্রিয়া মাধ্যমে অব্যাহত হয় Pend হবে SIGCONT


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