কেন Ctrl-C কাজ করেনি?


9

Ctrlcযে প্রক্রিয়াটি শেষ হতে অনেক সময় নিচ্ছে তা বন্ধ করার প্রয়াসে আমি আমার শেলটিতে দু'বার আঘাত করেছি।

^C দুবার প্রতিধ্বনিত হয়েছিল, তবে প্রক্রিয়াটি কেবল চলছে।

Ctrlcপ্রক্রিয়াটি সাধারণভাবে যেমন হয় তেমনটি ছেড়ে দেয়নি কেন ?


4
বিরক্তিকর প্রোগ্রামগুলির জন্য আমার সমাধান যা মরতে চায় না তাদের সাধারণত এটি সিটিআরএল + জেড এর সাথে স্থগিত করা হয় তারপরে kill -9 %এটি হত্যা করা। সিগন্যাল 9 উপেক্ষা করা যাবে না, বা স্থগিত সিগন্যালও দেওয়া যাবে না। সিটিআরএল + জেড কীবোর্ড সিকোয়েন্সটি তাত্ত্বিকভাবে উপেক্ষা করা যেতে পারে - তবে এটি বাস্তবে নেই।
ডেভিড সান্টি

@ ডেভিডসেইন্টি সাসপেন্ড সিগন্যালটিকে এড়িয়ে যেতে পারে (বা কমপক্ষে বন্ধ করা যায় না)। উদাহরণ: perl -E '$SIG{TSTP} = sub { say "ha ha" }; sleep 1 while 1'। আপনি সম্ভবত সিগস্টটপের কথা ভাবছেন যা একটি আলাদা সিগন্যাল।
ডারোবার্ট

আহ, তুমি সঠিক :)
ডেভিড Sainty

উত্তর:


13

প্রক্রিয়াগুলি এগুলি চয়ন করতে পারে:

  • সাধারণত সিগন্যাল সিগন্যালটিকে টিপে Ctrl-C( trap '' INTশেলের মতো) প্রেরণ করে এড়িয়ে যান বা এর জন্য তাদের নিজস্ব হ্যান্ডলার রয়েছে যা স্থির না করার সিদ্ধান্ত নেয় (বা সময়োপযোগী ফ্যাশনে শেষ করতে ব্যর্থ হয়)।
  • টার্মিনাল ডিভাইসটি বলুন যে পূর্বের কাজটিতে একটি চিহ্নের জন্য যে অক্ষরটি প্রেরণ করা হয় তা হ'ল অন্য কিছু ( stty int '^K'শেলের মতো)
  • টার্মিনাল ডিভাইসটিকে কোনও সংকেত না পাঠাতে বলুন ( stty -isigশেলের মতো)।

অথবা, এগুলি নিরবচ্ছিন্ন হতে পারে, যেমন কোনও সিস্টেম কলের মাঝামাঝি সময়ে যখন বাধা দেওয়া যায় না।

লিনাক্সে (তুলনামূলকভাবে সাম্প্রতিক কার্নেলের সাথে), আপনি বলতে পারেন যে কোনও প্রক্রিয়া আউটপুট দেখে সাইন ইনটিকে উপেক্ষা করছে এবং / অথবা পরিচালনা করছে কিনা

$ kill -l INT
2
$ grep Sig "/proc/$pid/status"
SigQ:   0/63858
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000002
SigCgt: 0000000000000000

উপরের সিগিনের দ্বিতীয় বিটটি 1, যার অর্থ SIGINT এড়ানো হবে।

আপনি এটি দিয়ে স্বয়ংক্রিয় করতে পারেন:

$ SIG=$(kill -l INT) perl -lane 'print $1 if $F[0] =~ /^Sig(...):/ && 
    $F[1] & (1<<($ENV{SIG}-1))' < "/proc/$pid/status"
Ign

বর্তমান intrঅক্ষরটি কি তা isigনির্দিষ্ট প্রদত্ত টার্মিনালের জন্য সক্ষম কিনা তা পরীক্ষা করতে :

$ stty -a < /dev/pts/0
[...] intr = ^C [...] isig

(উপরের intrঅক্ষরটি হ'ল ^C(চাপলে CTRL-Cএবং ইনপুট সংকেতগুলি অক্ষম না করা অবস্থায় সাধারণত আপনার টার্মিনাল দ্বারা প্রেরিত অক্ষর (এমুলেটর)) অক্ষম থাকে।

$ stty -a < /dev/pts/1
[...] intr = ^K [...] -isig

( intrচরিত্রটি ^Kএবং এর isigজন্য অক্ষম /dev/pts/1))

সম্পূর্ণতার জন্য, আরও দুটি উপায় আছে যেগুলি প্রক্রিয়া সাইন ইনগুলি পাওয়া বন্ধ করতে কিছু করতে পারে যদিও এটি আপনি সাধারণত দেখতে পাবে না।

এর পরে Ctrl+C, SIGINT সিগন্যালটি টার্মিনালের অগ্রভাগ প্রক্রিয়া গোষ্ঠীর সমস্ত প্রক্রিয়াতে প্রেরণ করা হয় । এটি সাধারণত শেল যে প্রক্রিয়া দলে দলে জায়গা প্রসেস (শেল ম্যাপ কাজ ) এবং টার্মিনাল ডিভাইস যা বলতে ফোরগ্রাউন্ড করুন।

এখন একটি প্রক্রিয়া পারে:

  • এর প্রক্রিয়া গ্রুপ ছেড়ে দিন। যদি এটি অন্য প্রক্রিয়া গোষ্ঠীতে স্থানান্তরিত হয় (যে কোনও প্রক্রিয়া গোষ্ঠী তবে সেই অগ্রভাগ এক) তবে এটি আর Ctrl-Cসাইনটটি পাবেন না (বা অন্যান্য কী-বোর্ড-সম্পর্কিত সিগন্যালগুলি যেমন SIGTSTP, SIGQUIT)। এটি টার্মিনাল ডিভাইস (পটভূমির প্রক্রিয়াগুলির মতো) থেকে পড়ার (সম্ভবত টার্মিনাল ডিভাইস সেটিংসের উপর নির্ভর করে লেখার চেষ্টা করা) চেষ্টা করলে এটি স্থগিত হয়ে যেতে পারে।

    উদাহরণ হিসাবে:

    perl -MPOSIX -e 'setpgid(0,getppid) or die "$!"; sleep 10'

    সঙ্গে বাধা হতে পারে না Ctrl-C। উপরের perlপ্রসেস গ্রুপে যোগদানের চেষ্টা করবে যার আইডি এটির প্যারেন্ট প্রসেস আইডির সমান। সাধারণভাবে, এই আইডি সহ এমন একটি প্রক্রিয়া গ্রুপ থাকার কোনও গ্যারান্টি নেই। তবে এখানে, perlএকটি ইন্টারেক্টিভ শেলের প্রম্পটে সেই কমান্ডটি তার নিজেরাই চালিত হয়, পিপিড শেলের প্রক্রিয়া হবে এবং শেলটি সাধারণত নিজস্ব প্রক্রিয়া গোষ্ঠীতে শুরু করা হবে।

    কমান্ডটি যদি ইতিমধ্যে কোনও প্রক্রিয়া গ্রুপের নেতা না হয় (সেই অগ্রভাগ প্রক্রিয়া গোষ্ঠীর নেতা), তবে এটি একটি নতুন প্রক্রিয়া গোষ্ঠী শুরু করা একই প্রভাব ফেলবে।

    উদাহরণস্বরূপ, শেলের উপর নির্ভর করে,

    $ ps -j >&2 | perl -MPOSIX -e 'setpgid(0,0) or die "$!"; sleep 10'
      PID  PGID   SID TTY          TIME CMD
    21435 21435 21435 pts/12   00:00:00 zsh
    21441 21441 21435 pts/12   00:00:00 ps
    21442 21441 21435 pts/12   00:00:00 perl

    একই প্রভাব আছে। psএবং perlফোরগ্রাউন্ড প্রক্রিয়া গ্রুপ শুরু হয়, কিন্তু বেশিরভাগ শেল উপর, psযা ওই দলের নেতা হতে হবে (যেমন দেখা psযেখানে উভয়ের pgid উপরে আউটপুট psএবং perlএর PID হয় ps), তাই perlতার নিজস্ব প্রক্রিয়া গ্রুপ শুরু করতে পারেন।

  • অথবা এটি অগ্রভূমি প্রক্রিয়া গ্রুপ পরিবর্তন করতে পারে। মূলত tty ডিভাইসটিকে অন্য কোনও প্রক্রিয়া গোষ্ঠীতে সাইন ইন প্রেরণ করতে বলুনCtrl+C

    perl -MPOSIX -e 'tcsetpgrp (0, getppid) বা মরা $ !; ঘুম 5 '

    সেখানে, perlএকই প্রক্রিয়া গোষ্ঠীতে রয়ে গেছে তবে পরিবর্তে টার্মিনাল ডিভাইসটি জানিয়ে দিচ্ছে যে অগ্রভাগ প্রক্রিয়া গ্রুপটিই তার আইডি তার প্যারেন্ট প্রসেস আইডি হিসাবে একই (এটি সম্পর্কে উপরে নোট দেখুন)।


1
নিরবচ্ছিন্ন কলটির একটি ভাল উদাহরণ হ'ল এমন একটি হার্ডওয়্যার ডিভাইস অ্যাক্সেস করা যা সাড়া দেয় না। উদাহরণস্বরূপ, আপনি যদি কোনও ত্রুটিযুক্ত হার্ড ডিস্ক ব্যবহার করার চেষ্টা করেন hdparmবা smartctlকোনও প্রতিক্রিয়া না দেয় তবে তারা চিরতরে ঝুলবে এবং আপনি তাদের সিটিআরএল + সি দিয়ে হত্যা করতে পারবেন না। কোনও প্রক্রিয়া নিরবচ্ছিন্ন ঘুমের ps auxমধ্যে top/ এর এস কলামে / htop- এর Dনিরবচ্ছিন্ন ঘুম মানে আপনি বলতে পারেন । এটি অগত্যা কোনও খারাপ জিনিস নয়, এটির অর্থ কেবল এই হতে পারে যে প্রক্রিয়াটি প্রচুর আইও করছে।
মার্টিন ভন উইট্টিচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.