সিগন্যাল

Last updated 3 months ago

একটি নির্দিষ্ট প্রসেসকে বিশেষ কিছু করতে বলার পদ্ধতি হচ্ছে সিগন্যাল। তা হতে পারে আমরা তাকে বন্ধ হতে বা পজ করতে বলছি। আবার চালু হতে বলছি আরেকটি সিগন্যাল দিয়ে। প্রসেসকে সিগন্যাল পাঠাতে আমরা যে কমান্ডটি ব্যবহার করি সেটি হচ্ছে kill। এই কমান্ডের কমান্ডকাঠামো এরকম:

kill [-signal] PID_or_Job-ID...

অর্থাৎ প্রথমে কমান্ডটি তারপর যে সিগন্যালটি পাঠাতে চাই সেটি(নাম্বার বা নাম দিয়ে প্রকাশ করা) '-' চিহ্নসহ তারপর যে যে প্রসেসকে সিগন্যালটি দিতে চাই তাদের PID বা Job ID। কোনো সিগন্যালের নাম দেয়া না হলে ডিফল্টভাবে TERM সিগন্যালটি পাঠানো হয়।

আসুন, সচরাচর ব্যবহৃত সিগন্যালগুলো দেখি:

নাম্বার

নাম

অর্থ

1

HUP

হ্যাংআপ(Hangup)। এটি বলা যেতে পারে একটি ঐতিহ্যবাহী সিগন্যাল। পার্সনাল কম্পিউটার যখনও হাতে হাতে এসে পৌঁছায়নি তখন দূরবর্তী কম্পিউটারের সাথে ফোনলাইন বা মডেমের মাধ্যমে বহুমানুষ টার্মিনাল দিয়ে যুক্ত থাকত। এই টার্মিনালগুলো একধরনের কন্ট্রোলিং ডিভাইস। এই সিগন্যাল পাঠালে বুঝে নেয়া হত কন্ট্রোলিং টার্মিনালটি হ্যাংআপ করা হয়েছে। যেমনটা আমরা ফোনে করে থাকি। ফলাফল হিসেবে টার্মিনালে চালু থাকা সেশনগুলো বন্ধ করা হত। অনেক Daemon(যেমন Apache web server) এই সিগন্যালটিকে রিইনিশিয়ালাইজেশনের জন্য ব্যবহার করে। এই ডেমনগুলোকে এই সিগন্যাল পাঠালে তারা রিস্টার্ট নেয় এবং কনফিগারেশন ফাইলগুলো নতুন করে পড়ে।

2

INT

ইন্টারাপ্ট(Interrupt)। আমরা আগের লেসন Ctrl-c চেপে যা করেছি তাই করে। এই সিগন্যালটি পাঠালে অধিকাংশক্ষেত্রে প্রোগ্রামটি বন্ধ হয়ে যায়।

3

QUIT

কুইট(Quit)। নামেই এর অর্থ পরিষ্কার। প্রোগ্রাম কুইট করে। এটি একটি সিস্টেম সিগন্যাল অর্থাৎ সিস্টেম এটিকে ব্যবহার করে।

9

KILL

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

11

SEGV

সেগমেন্টেশন ভায়োলেশন(Segmentation Violation)। এই সিস্টেম সিগন্যালটি তখন ব্যবহৃত হয় যখন কোনো প্রসেস ভুলভাবে মেমরী ব্যবহার করে বা এমন কোথাও তথ্য লিখতে যায় যেখানে তার অধিকার নেই।

15

TERM

টার্মিনেট(Terminate)। kill কমান্ডের সাথে কোনো সিগন্যাল না দেয়া হলে এই ডিফল্টভাবে এই সিগন্যালটি দেয়া হয়। এটি দিয়ে প্রসেসটি টার্মিনেট বা ধ্বংস করা হয়।

18

CONT

কন্টিনিউ(Continue)। STOP সিগন্যাল দিয়ে স্টপ করা বা পজ করা প্রসেসকে আবার সচল করে।

19

STOP

KILL সিগন্যালের মতই এই সিগন্যালটিও কার্নেল কার্যকর করে। তবে এক্ষেত্রে প্রসেসটিকে পজ করে দেয়া হয়।

20

TSTP

টার্মিনাল স্টপ(Terminal stop)। যখন টার্মিনালে Ctrl-z চাপা হয় তখন এই সিগন্যালটি টার্মিনাল পাঠায়। সাধারন স্টপ সিগন্যালের মত এটি কার্নেল না বরং স্বয়ং প্রসেসটি কার্যকর করে। এবং চাইলে প্রসেসটি এটিকে অগ্রাহ্য করতে পারে।

28

WINCH

উইন্ডো চেঞ্জ(Window change)। যখন কোনো উইন্ডো রিসাইজ করা হয় তখন সিস্টেম এই সিগন্যালটি প্রসেসকে পাঠায়। বিভিন্ন প্রোগ্রাম যেমন top বা less এই সিগন্যালে সাড়া দেয় এবং নিজেদের রিসাইজ করে নতুন উইন্ডো সাইজে নিয়ে আসে।

kill -l কমান্ড দিয়ে আপনি চাইলে সকল সিগন্যালের লিস্টটি পেতে পারেন।

এবার আসুন kill কমান্ডের কিছু ব্যবহার দেখি:

e@howtocode-pc:~$ xlogo &
[1] 11810
me@howtocode-pc:~$ kill -STOP 11810
me@howtocode-pc:~$ jobs
[1]+ Stopped xlogo
me@howtocode-pc:~$ kill -CONT %1
me@howtocode-pc:~$ jobs
[1]+ Running xlogo &
me@howtocode-pc:~$ kill -9 %1
[1]+ Killed xlogo
me@howtocode-pc:~$
  • প্রথম আমরা xlogo & কমান্ড দিয়ে xlogo এর একটি ব্যাকগ্রাউন্ড প্রসেস তৈরী করেছি। যার Job ID হচ্ছে 1 এবং PID হচ্ছে 11810।

  • প্রথম kill কমান্ডটি ছিল kill -STOP 11810 এখানে আমরা কমান্ডের অপশন হিসেবে সিগন্যালের নাম ব্যবহার করেছি। STOP সিগন্যাল প্রসেসটিকে স্টপ বা পজ করবে। এবং প্রসেসটিকে প্রকাশ করেছি তার PID দিয়ে।

  • এরপর jobs কমান্ড দিয়ে আমরা দেখতে পাচ্ছি প্রসেসটি Stopped অবস্থায় আছে।

  • এরপর আমরা যে kill কমান্ডটি ব্যবহার করেছি সেটি ছিল kill -CONT %1। এখানেও অপশন হিসেবে আমরা সিগন্যালটির নাম ব্যবহার করেছি। এবার আমাদের উদ্দেশ্য স্টপ করা প্রসেসটিকে কনটিনিউ করা। তবে এবার আমরা PID না বরং Job ID ব্যবহার করেছি। প্রসেসটির Job ID ছিল 1 তাই আমরা লিখেছি %1।

  • এবার আমরা jobs কমান্ড দিয়ে দেখলাম স্টপড প্রসেসটি রানিং দেখাচ্ছে।

  • এবার আমরা প্রসেসটি বন্ধ করবো। বন্ধ করতে আমরা KILL সিগন্যালটি ব্যবহার করবো। কিন্তু এবারে আমরা সিগন্যালটিকে নাম না তার সংখ্যায় প্রকাশ করছি। KILL সিগন্যালের সংখ্যা হল 9 এবং আমাদের প্রসেসটি Job ID হল 1 তাই আমাদের কমান্ডটি হল kill -9 %1

killall

killall একটি বিশেষ কমান্ড যেটি দিয়ে একজন ইউজার বা একটি প্রোগ্রামের সবগুলো প্রসেসকে একসাথে সিগন্যাল পাঠানো যায়। এর কমান্ডকাঠামো এরকম:

killall [-u user] [-signal] name...

এখানে ইউজার ও সিগন্যাল দুটোই অপশনাল। kill কমান্ডের মত killall ও ডিফল্টভাবে TERM সিগন্যাল পাঠায়।

নীচের উদাহরণে আমরা xlogo & কমান্ড দুবার দিয়ে এর দুটি প্রসেস তৈরী করছি। তারপর killall xlogo কমান্ড দিয়ে তাদের একসাথে টার্মিনেট করছি:

me@howtocode-pc:~$ xlogo &
[1] 24760
me@howtocode-pc:~$ xlogo &
[2] 24761
me@howtocode-pc:~$ killall xlogo
[1]- Terminated xlogo
[2]+ Terminated xlogo