সিস্টেম কখন কোনও প্রসেসে একটি সিগন্যটার পাঠায়?


24

আমার সার্ভার প্রোগ্রামটি একটি SIGTERM পেয়েছে এবং বন্ধ হয়ে গেছে (প্রস্থান কোড 0 সহ)। আমি এতে অবাক হয়েছি, কারণ আমি নিশ্চিত যে এটির জন্য প্রচুর স্মৃতি ছিল। কোন অবস্থার অধীনে লিনাক্স (ব্যস্তবক্স) কোনও প্রক্রিয়াতে একটি সিগমেন্টটার প্রেরণ করে?


কার্নেল বা কোনও মানক সরঞ্জাম কোনও এলোমেলো প্রক্রিয়াতে SIGTERM প্রেরণ করবে এমন কোনও ক্ষেত্রেই আমি ভাবতে পারি না। প্রোগ্রামটি কী করছে এবং এটি কীভাবে শুরু হয়েছে সে সম্পর্কে আপনি আমাদের কী বলতে পারেন? আপনি প্রোগ্রামটির প্রস্থান স্থিতি সম্পর্কে কীভাবে সন্ধান করলেন? আপনি সমস্যার পুনরুত্পাদন করতে পারেন? আপনার কি লগ আছে যা আপনি পরীক্ষা করতে পারেন?
গিলস

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

1
পজিক্স ডকুমেন্টেশন ইঙ্গিত দেয় যে সাইনটার্ম কঠোরভাবে ব্যবহারকারী স্তরের ইভেন্ট। এটি কি অন্য কেউ আপনার সার্ভার প্রোগ্রামটি হত্যা করতে সক্ষম হয়েছিল?
শেল্টার

3
তুমি! রিটার্ন কোড 0 এর অর্থ একটি সাধারণ প্রস্থান। যদি কোনও সিগনেটার থাকে $?তবে 143 (128 + সিগন্যাল নম্বর) এ সেট করা হবে।
গিলস 18:36-

1
এছাড়াও, ডিগ্রি সেন্টিগ্রেড হ'ল সাইন ইন, সাইনটারম নয় এবং এটি 130
নম্বর

উত্তর:


13

আমি এটিকে উত্তর হিসাবে পোস্ট করব যাতে এটির কোনও সমস্যা রয়েছে যদি এটির সমস্যাটি দেখা দেয়।

0 এর প্রস্থান স্থিতিকরণ মানে একটি সফল প্রোগ্রাম থেকে স্বাভাবিক প্রস্থান। একটি বহির্গমন প্রোগ্রাম তার প্রস্থান স্থিতি হিসাবে 0 এবং 255 এর মধ্যে যে কোনও পূর্ণসংখ্যা চয়ন করতে পারে। প্রচলিতভাবে, প্রোগ্রামগুলি ছোট মান ব্যবহার করে। 126 এবং তার বেশি মানগুলি শেল দ্বারা বিশেষ অবস্থার প্রতিবেদন করার জন্য ব্যবহৃত হয়, সুতরাং এগুলি এড়ানো ভাল।

সি এপিআই স্তরে, প্রোগ্রামগুলি একটি 16-বিট স্থিতি প্রতিবেদন করে - যা প্রোগ্রামের প্রস্থান স্থিতি এবং এটি মেরে ফেলা সিগন্যাল উভয়ই এনকোড করে।

শেলের মধ্যে, একটি কমান্ডের প্রস্থান স্থিতি (সঞ্চিত $?) প্রোগ্রামের আসল প্রস্থান স্থিতি এবং সংকেতের মানকে সংযুক্ত করে: যদি কোনও প্রোগ্রাম একটি সিগন্যাল দ্বারা নিহত হয়, $?তবে 128 এর চেয়ে বেশি মানতে সেট করা হয় (বেশিরভাগ শেল সহ, এই মানটি হয়) 128 প্লাস সিগন্যাল নম্বর; এটিটি কেএস 256 + সিগন্যাল নম্বর ব্যবহার করে এবং যশ 384 + সিগন্যাল নম্বর ব্যবহার করে, যা অস্পষ্টতা এড়ায়, তবে অন্যান্য শেলগুলি মামলা অনুসরণ করে না)।

বিশেষত, যদি $?0 হয় তবে আপনার প্রোগ্রামটি স্বাভাবিকভাবেই প্রস্থান করা হবে।

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


আপনার শিরোনামে প্রশ্নের উত্তর দেওয়ার জন্য, সিস্টেমের মাধ্যমে স্বাক্ষরটি কখনই স্বয়ংক্রিয়ভাবে প্রেরণ করা হয় না SIG কয়েকটি সিগন্যাল রয়েছে যেগুলি স্বয়ংক্রিয়ভাবে সিগআপের মতো প্রেরণ করা হয় যখন টার্মিনালটি চলে যায়, সিগসাইজিভি / সিগবস / সিগিল যখন কোনও প্রক্রিয়া এমন কাজ করে যা না করা উচিত, সাইনপাইপ যখন এটি কোনও ভাঙা পাইপ / সকেট ইত্যাদিতে লেখেন ইত্যাদি there কয়েক সংকেত যে একটি টার্মিনাল একটি গুরুত্বপূর্ণ সংবাদ কারণে পাঠানো হয়, প্রধানত জন্য SIGINT Ctrl+ + C, জন্য SIGQUIT Ctrl+ + \এবং SIGTSTP জন্য Ctrl+ + Z, কিন্তু SIGTERM ঐ এক নয়। যদি কোনও প্রক্রিয়া SIGTERM গ্রহণ করে তবে অন্য কিছু প্রক্রিয়া সেই সংকেত পাঠিয়েছে।

Ly মোটামুটি কথা বলছি


সিগন্যাল পাওয়ার পরে কীভাবে প্রস্থান স্থিতি নির্ধারণ করা হয় তার দুর্দান্ত ব্যাখ্যা। যাইহোক, এই উত্তরটি ওপির প্রশ্নের সমাধান করে না।
কোডফোরস্টার

1
@ কোডে ফরেস্টার আমি শরীরে প্রশ্নের উত্তর দিয়েছি, শিরোনামের প্রশ্নটি নয়। ঠিক আছে, শরীরের একটি প্রশ্ন - এটি দেওয়া হয়েছে যে এটি একটি ভুল বোঝাবুঝির ভিত্তিতে তৈরি হয়েছিল, এটি কিছুটা অগোছালো। আমি বাকী কয়েকটি শব্দ যুক্ত করব।
গিলস 'দুষ্ট হওয়া বন্ধ করুন'

এটি শেলের উপর নির্ভর করে। Ksh93 এ, এটি 256 + সাইনাম, ইয়াশে, এটি 384 + সাইনাম
স্টাফেন চেজেলাস

নোট করুন যে 256 লা ksh এর উপরে একটি মান ব্যবহার করা অপরিহার্যভাবে ভাল নয় যেহেতু এটি পাস করা বাধা দেয় exityashপদ্ধতির একটি ভাল আপস, কিন্তু অন্য এক জন্য RC দেখুন। আরও দেখুন ডিফল্ট প্রস্থান কোড যখন প্রক্রিয়া সমাপ্ত করা হয়?
স্টাফেন চেজেলাস

10

সিগনটারম হ'ল সিগন্যাল যা সাধারণত কোনও প্রক্রিয়া প্রশাসনিকভাবে শেষ করতে ব্যবহৃত হয়।

এটি কোনও সিগন্যাল নয় যা কার্নেল প্রেরণ করবে, তবে এটি সেই সংকেত যা কোনও প্রক্রিয়া সাধারণত অন্য প্রক্রিয়াটি সমাপ্ত করতে (করুণার সাথে) প্রেরণ করবে।

যে সংকেত দ্বারা ডিফল্টরূপে পাঠানো হয় যে kill, pkill, killall, fuser -k... কমান্ড।

এটি সেই সংকেত যা ডেমোনগুলিতে তাদের থামানোর জন্য প্রেরণ করা হয় (যেমন একটি service some-service stop), বা initশটডাউনের আগে প্রেরণ করা হয়েছে (সেই প্রক্রিয়াগুলির জন্য সিগ্কিল অনুসরণ করবে যা সাইনটারেমে সময়মতো শেষ করতে সক্ষম হয় নি)।

দ্রষ্টব্য যে SIGTERM প্রেরিত সিগন্যাল নয়^C । সিগন্যালটি প্রেরণ করা ^Cহয় SIGINT।

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