@Hvd এর উত্তরটি মূলত সঠিক। এটিকে আরও ব্যাক আপ করার জন্য, আপনি যখন আপনার কম্পিউটারটি বন্ধ করে দিচ্ছেন তখন প্রক্রিয়াটি initপ্রথমে SIGTERMপ্রসেসগুলিতে প্রেরণ করবে , তারপরে একটি বিলম্বের পরে প্রেরণ করবে SIGKILLযদি তারা ইতিমধ্যে না উপস্থিত থাকে। প্রক্রিয়াগুলি হ্যান্ডেল / উপেক্ষা করতে পারে না SIGKILL।
যদিও আরও কিছুটা বিশদ দেওয়ার জন্য, আসল উত্তরটি হ'ল যে প্রোগ্রামটি এটি পরিচালনা করে তা নিশ্চিত করে আপনার জানার কোনও উপায় নেই। SIGTERMবিনীতভাবে কোনও প্রোগ্রাম ছাড়তে বলার জন্য ব্যবহার করা সর্বাধিক সাধারণ সিগন্যাল, তবে সমস্ত সিগন্যাল হ্যান্ডলিং সিগন্যাল সহ কিছু করা প্রোগ্রামের উপর নির্ভর করে।
এটিকে অন্যভাবে উত্তর দেওয়ার জন্য, যদি আপনার কাছে @ জোস বা @ অ্যালেক্সগ্রিগ দ্বারা লিখিত একটি প্রোগ্রাম থাকে তবে তারা সম্ভবত পরিচালনা করে SIGQUITতবে সম্ভবত তা করা হয় না SIGTERM, এবং তাই পাঠানো SIGTERMকম "নরম" হতে পারে SIGQUIT।
আমি কিছু কোড লিখেছি যাতে আপনি নিজের সাথে এটি খেলতে পারেন। নীচের হিসাবে সংরক্ষণ করুন signal-test.c, তারপরে সংকলন করুন
gcc -o signal-test signal-test.c
তারপরে আপনি এটিকে চালাতে পারেন ./signal-testএবং দেখুন যখন আপনি এর সাথে বিভিন্ন সংকেত প্রেরণ করেন তখন কী ঘটে killall -s <signal>।
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int flag = 0;
void handle_signal(int s)
{
flag = s;
}
int main(int argc, char *argv[])
{
signal(SIGTERM, handle_signal);
signal(SIGQUIT, handle_signal);
while(flag == 0){
sleep(1);
}
printf("flag is %d\n", flag);
return flag;
}
যেমনটি দাঁড়িয়েছে, কোডটি سگরটার এবং সিকুইট উভয়কে কৌতুকপূর্ণভাবে পরিচালনা করে। আপনি সিগন্যাল হ্যান্ডলারটি সরাতে লাইনগুলি signal(SIG...( লাইনের //শুরুতে একটি ব্যবহার করে) মন্তব্য করার চেষ্টা করতে পারেন, তারপরে চালান এবং আবার সিগন্যাল প্রেরণ করুন। আপনি এই বিভিন্ন আউটপুট দেখতে সক্ষম হতে হবে:
$ ./signal-test
Terminated
$ ./signal-test
Quit (core dumped)
$ ./signal-test
flag is 15
$ ./signal-test
flag is 3
আপনি সংকেতগুলি পরিচালনা করেন কিনা তা নির্ভর করে।
আপনি সিগন্যাল উপেক্ষা করার চেষ্টা করতে পারেন:
signal(SIGTERM, SIG_IGN);
যদি আপনি এটি করেন তবে প্রেরণ SIGTERMকিছুই করবে না, SIGKILLপ্রক্রিয়াটি শেষ করতে আপনাকে ব্যবহার করতে হবে।
আরও বিশদ man 7 signal। নোট করুন যে এইভাবে ব্যবহার করা signal()অ-বহনযোগ্য হিসাবে বিবেচিত হয় - এটি বিকল্পের তুলনায় অনেক সহজ!
অন্য একটি ছোটখাটো পাদটীকা - সোলারিস killallসমস্ত প্রক্রিয়া হত্যা করার চেষ্টা করে। তাদের সবাই. আপনি যদি এটি রুট হিসাবে চালনা করেন তবে আপনি অবাক হতে পারেন :)