প্রতিটি পটভূমি প্রক্রিয়া শেষ করুন


10

আমার কয়েকটি Stoppedব্যাকগ্রাউন্ড প্রক্রিয়া রয়েছে।

kill $(jobs -p)এবং kill `jobs -p`কোন প্রভাব আছে

kill %1, kill %2ইত্যাদি ইত্যাদি পৃথক প্রক্রিয়াগুলি সফলভাবে শেষ করে

আমি কীভাবে প্রতিটি কমান্ড দিয়ে প্রতিটি পটভূমি প্রক্রিয়াটিকে হত্যা করতে পারি?

এছাড়াও, প্রথম দুটি কমান্ড কেন আমার পক্ষে কাজ করে না?

আমি লিনাক্স মিন্ট 15, 64 বিট চালাচ্ছি

উত্তর:


10

যখন তারা চলছে

দেখে মনে হচ্ছে আপনি কেবল এটির সাথে killএবং এর আউটপুটটি করতে পারেন jobs -p

উদাহরণ

$ sleep 1000 &
[1] 21952
$ sleep 1000 &
[2] 21956
$ sleep 1000 &
[3] 21960

এখন আমার 3 টি ভুয়া কাজ চলছে।

$ jobs
[1]   Running                 sleep 1000 &
[2]-  Running                 sleep 1000 &
[3]+  Running                 sleep 1000 &

তাদের সবাইকে এভাবে মেরে ফেলুন:

$ kill $(jobs -p)
[1]   Terminated              sleep 1000
[2]-  Terminated              sleep 1000
[3]+  Terminated              sleep 1000

নিশ্চিত হয়ে তারা সবাই চলে গেছে।

$ jobs
$

যখন তাদের থামানো হবে

আপনার যদি চাকরি বন্ধ থাকে তবে চালাচ্ছেন না পরিবর্তে এটি করুন।

উদাহরণ

$ kill $(jobs -p)

$ jobs
[1]+  Stopped                 sleep 1000
[2]-  Stopped                 sleep 1000
[3]   Stopped                 sleep 1000

ঠিক আছে যাতে এটি তাদের হত্যা করে না, তবে এটি হ'ল কিল সংকেত প্রক্রিয়াটি নিজেই পরিচালনা করতে পারে না, এটি বন্ধ হয়ে গেছে। সুতরাং ওএসকে পরিবর্তে হত্যা করতে বলুন। এটা কি -9জন্য হয়।

$ kill -9 $(jobs -p)
[1]+  Killed                  sleep 1000
[2]-  Killed                  sleep 1000
[3]   Killed                  sleep 1000

এটা তুলনামূলক ভাল.

$ jobs
$ 

যখন কিছু চলমান থাকে এবং কিছু বন্ধ হয়ে যায়

আপনার যদি প্রক্রিয়াগুলির একটি মিশ্র ব্যাগ থাকে যেখানে কিছুগুলি বন্ধ হয়ে যায় এবং কিছু চলমান থাকে তবে আপনি killপ্রথমে একটি এর পরে করতে পারেন kill -9

$ kill $(jobs -p); sleep <time>; \
    kill -18 $(jobs -p); sleep <time>; kill -9 $(jobs -p)

প্রক্রিয়াগুলি প্রথমে তাদের থামানোর অনুমতি দেওয়ার জন্য যদি আপনার আরও প্রয়োজন হয় তবে সময়টি সামান্য বাড়ানো।

সংকেত

হত্যার জন্য কোনও এইচইউপি (-1) বা একটি সিগন্টার (-15) সফল হবে না। কিন্তু কেন? এর কারণ এই সংকেতগুলি এই অর্থে কৃপণতাপূর্ণ যে তারা অ্যাপ্লিকেশনটি নিজেকে শেষ করে দেওয়ার জন্য বলছে। তবে যেহেতু অ্যাপ্লিকেশনটি বন্ধ অবস্থায় রয়েছে এটি এই সংকেতগুলিকে প্রক্রিয়া করতে পারে না। সুতরাং আপনি কেবল কোর্সটিই একটি সিগকল (-9) ব্যবহার করা।

আপনি সমস্ত সংকেত দেখতে পারেন killপ্রদান করে kill -l

$ kill -l | column -t
1)   SIGHUP       2)   SIGINT       3)   SIGQUIT      4)   SIGILL       5)   SIGTRAP
6)   SIGABRT      7)   SIGBUS       8)   SIGFPE       9)   SIGKILL      10)  SIGUSR1
11)  SIGSEGV      12)  SIGUSR2      13)  SIGPIPE      14)  SIGALRM      15)  SIGTERM
16)  SIGSTKFLT    17)  SIGCHLD      18)  SIGCONT      19)  SIGSTOP      20)  SIGTSTP
21)  SIGTTIN      22)  SIGTTOU      23)  SIGURG       24)  SIGXCPU      25)  SIGXFSZ
26)  SIGVTALRM    27)  SIGPROF      28)  SIGWINCH     29)  SIGIO        30)  SIGPWR
31)  SIGSYS       34)  SIGRTMIN     35)  SIGRTMIN+1   36)  SIGRTMIN+2   37)  SIGRTMIN+3
38)  SIGRTMIN+4   39)  SIGRTMIN+5   40)  SIGRTMIN+6   41)  SIGRTMIN+7   42)  SIGRTMIN+8
43)  SIGRTMIN+9   44)  SIGRTMIN+10  45)  SIGRTMIN+11  46)  SIGRTMIN+12  47)  SIGRTMIN+13
48)  SIGRTMIN+14  49)  SIGRTMIN+15  50)  SIGRTMAX-14  51)  SIGRTMAX-13  52)  SIGRTMAX-12
53)  SIGRTMAX-11  54)  SIGRTMAX-10  55)  SIGRTMAX-9   56)  SIGRTMAX-8   57)  SIGRTMAX-7
58)  SIGRTMAX-6   59)  SIGRTMAX-5   60)  SIGRTMAX-4   61)  SIGRTMAX-3   62)  SIGRTMAX-2
63)  SIGRTMAX-1   64)  SIGRTMAX

আপনি যদি বিভিন্ন সংকেত সম্পর্কে আরও জানতে চান তবে আমি একজনকে সিগন্যাল ম্যান পৃষ্ঠাতে একবার দেখার জন্য উত্সাহিত করি man 7 signal,।


কেন +আমাদের প্রথম প্রক্রিয়াটির -জন্য প্রতীক এবং দ্বিতীয় প্রক্রিয়ার জন্য প্রতীক এবং তৃতীয়টিতে কোনও চিহ্ন নেই?
রমেশ

আপনার মতো ফলাফলও পেয়েছি। তবে আমি এর terminateপরিবর্তে চাই kill, যেহেতু আমি পড়েছি এটি নিরাপদ। আমি চেষ্টা করেছিলাম kill -15 $(jobs -p), কিন্তু এর কোনও ফল হয়নি। আমি অনুমান করেছি যে থামানো প্রক্রিয়াগুলি কেবল হত্যা করা যায় তবে তারপরে আবার kill %number(পৃথক) বন্ধ প্রক্রিয়াগুলি শেষ করে।
ব্যবহারকারী 49888

@ রমেশ দ্যা +এবং উদাহরণগুলি স্থাপন করার সময় কেবল -শেষ প্রক্রিয়াগুলিই আমি স্পর্শ করেছি। এর +অর্থ হ'ল যে কোনও আদেশ যা স্পষ্টভাবে একটি অন্তর্ভুক্ত করে না সেগুলি এই আদেশটিতে %#কাজ করবে। ড্যাশ ( -) হ'ল দ্বিতীয়টি থেকে শেষ কমান্ডটি আমি স্পর্শ করেছি।
slm

@ user49888 - kill -9 .. কাজ করা উচিত ছিল। প্রক্রিয়াগুলি কি? এগুলি কি অনর্থক বা এতিম প্রক্রিয়াগুলি?
slm

1
@ ব্যবহারকারী 49888 - হ্যাঁ প্রক্রিয়া যদি কোনও কিছুর মাঝামাঝি হয় তবে এটি সমাপ্ত হওয়ার আগে কোনও পরিষ্কার-পরিচ্ছন্ন করার সুযোগ দেওয়া হয়নি।
slm

2

আপনি এটি চেষ্টা করতে পারেন।

for x in `jobs -p`; do kill -9 $x; done

তবে, আপনি যদি প্রক্রিয়াটি শেষ করতে চান তবে আপনি কমান্ডটি এই হিসাবে জারি করতে পারেন,

for x in `jobs -p`; do kill -15 $x; done

কমান্ডের উইকি পৃষ্ঠা থেকে Kill,

কোনও প্রক্রিয়াতে চারটি উপায়ে একটি সিগনটার সিগন্যাল প্রেরণ করা যায় (প্রক্রিয়া আইডি এই ক্ষেত্রে '1234'):

kill 1234
kill -s TERM 1234
kill -TERM 1234
kill -15 1234

প্রক্রিয়াটি তিনটি উপায়ে একটি সিগ্কিল সিগন্যাল প্রেরণ করা যেতে পারে :

kill -s KILL 1234
kill -KILL 1234
kill -9 1234

এই উত্তরে বর্ণিত হিসাবে , এটি হ'ল টার্মিনেট এবং হত্যার মধ্যে পার্থক্য ।

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

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


এটি killপ্রতিটি পটভূমি প্রক্রিয়া করে। তবে, এর terminateপরিবর্তে তাদের কাছে কি কোনও উপায় আছে , যেহেতু আমি বিশ্বাস করি যে এটি নিরাপদ?
ব্যবহারকারী 49888

যদি আপনি শেষ করতে চান তবে আপনি -15কমান্ড কমান্ড ব্যবহার করতে পারেন ।
রমেশ

-15এখানেও কাজ করবে না। আমার এ
স্ল্যাম

@ রমেশ - শেষ ২ টি অনুচ্ছেদ সঠিক নয়। একটি সাইনটারম প্রেরণ করা হয় না (শুরুতে নয়)। প্রক্রিয়াগুলি সেখানে পরিষেবা স্টপ / স্ক্রিপ্টগুলি শুরু করার মাধ্যমে প্রথমে থামার চেষ্টা করা হয়। যদি সেই প্রক্রিয়াটিতে 9 জনকে প্রেরণ করা হত তবে ওপির উদাহরণে যেমন প্রক্রিয়াগুলি বন্ধ হয়ে গেছে তখন kill -9আমার উদাহরণের উদাহরণটি কাজ করবে না।
slm

1

ঠিক আছে, এটিকে ঘিরে খেলে আমি দেখতে পাচ্ছি যে আপনি যখন কোনও কাজ বন্ধ করে দেন যা বন্ধ হয়ে গেছে (যেখানে মৃত্যুদণ্ড কার্যকর করা বন্ধ হয়ে গেছে তবে সমাপ্ত হয়নি), তবে অগ্রভাগে আনার আগ পর্যন্ত এটি শেষ হবে না। প্রোগ্রামগুলি সাধারণত Ctrl- Zটার্মিনালে টিপে থামানো হয় । বেশিরভাগ টার্মিনালগুলি SIGSTOPএই ক্ষেত্রে প্রেরণ করে তবে অবশ্যই এটি পাঠানোর অন্যান্য উপায়ও রয়েছে যেমন সাথে kill -STOPবা এর সাথে kill -19

প্রোগ্রামটি এখনই শেষ না করা স্বাভাবিক আচরণ কারণ প্রোগ্রামটি SIGTERMপ্রেরিত ডিফল্ট সিগন্যালটি প্রক্রিয়া করার জন্য চলছে kill। তদুপরি, কখনও কখনও একটি পটভূমি প্রক্রিয়া bashপ্রেরণের পরে SIGTERM, এটি একরকম বন্ধ হয়ে যায় (যদিও এটি SIGTERMএখনও মুলতুবি রয়েছে)।

সবচেয়ে নিরাপদ উপায় (ফিনিস সব কাজ পেতে ছাড়া অবলম্বন kill -9) পাঠাতে প্রথম SIGTERMএকটি স্বাভাবিক সঙ্গে killপাঠাতে, তারপর SIGCONTকোন অবশিষ্ট কাজ, যেমন হবে:

kill $(jobs -p)
kill -18 $(jobs -p)

SIGCONT( 18যাতে তারা প্রক্রিয়া করতে পারি সংকেত সংখ্যা লিখুন) ফোরগ্রাউন্ড মধ্যে কোনো থামানো কাজ আনতে হবে SIGTERMহিসাবে তারা স্বাভাবিকভাবে would।

যদি সমস্ত প্রোগ্রামগুলি এটির সাথে শেষ না করে, তবে আরও কয়েকটি সংকেত রয়েছে যা আপনি চেষ্টা করতে পারেন যে সাধারনত প্রক্রিয়াটি শেষ করে নিন, অবলম্বন করার আগে kill -9। আমি প্রথমে প্রস্তাবিত SIGHUPএকটি হ'ল প্রচুর প্রোগ্রাম যেগুলি সাধারণত অন্যান্য সমাপ্তি সংকেতগুলিতে সাড়া দেয় SIGHUP। একটি নিয়ামক টার্মিনাল বন্ধ হয়ে গেলে এটি সাধারণত পাঠানো হয়, বিশেষত এটি যখন পাঠানো হয় তখন একটি sshসেশন ttyশেষ হওয়ার সাথে সাথে শেষ হয়। অনেকগুলি ইন্টারেক্টিভ প্রোগ্রাম, যেমন শাঁস, অন্যান্য সমাপ্তি সংকেতগুলিতে প্রতিক্রিয়া জানায় না তবে এটিই ঘটবে কারণ একটি sshঅধিবেশন শেষ হওয়ার পরে (বা কোনও নিয়ন্ত্রণকারী টার্মিনাল বন্ধ হয়ে যাওয়ার পরে) তাদের জন্য এটি চলমান সমস্যা হবে । এটি চেষ্টা করার জন্য আপনি এটি করতে পারেন

kill -1 $(jobs -p)
kill -18 $(jobs -p)

আবার অবশ্যই আপনার অবশ্যই নিশ্চিত হওয়া দরকার যে প্রোগ্রামটি বন্ধ হয়নি যাতে এটি সংকেতটি প্রক্রিয়া করতে পারে। অন্যান্য সমাপ্তি সংকেতগুলি আপনি চেষ্টা করতে পারেন SIGINT( kill -2) এবং SIGQUIT( kill -3)। তবে অবশ্যই সম্পূর্ণ পরিসীমা চেষ্টা করার সুবিধা হ্রাস পাবে এবং একটি অনিবার্য হতে পারে SIGKILL(ওরফে kill -9)।


আপনি যদি একটি করেন man signalতবে এটিকে ব্যাক আপ করার জন্য আপনি রেফারেন্স উপাদানটি পেতে পারেন।
slm

এটি আমার এ পরামর্শ দেয় এর একটি নরম রূপ। এমন কিছু উদাহরণ রয়েছে যেখানে আমি অতীতে গিয়েছিলাম যেখানে এটি এখনও পুরোপুরি পরিষ্কার করবে না তাই আপনি যদি কোনও স্ক্রিপ্ট থেকে এটি করছেন তবে kill -9 ..পদ্ধতি বেশিরভাগ ক্ষেত্রে কাজ করবে। এটি মাঝে মাঝে ঝুলন্ত প্রক্রিয়াগুলি ছেড়ে দেবে, তাই বেশি সময় ব্যর্থ হবে। এটি আপনাকে সিদ্ধান্ত নিতে হবে এমন একটি বাণিজ্য। ভারী হাতে থাকা এবং সবকিছুকে মেরে ফেলা ভাল, ডেটা / ক্লিনআপ বনাম একটি নরম সাফাইয়ের ঝুঁকিপূর্ণ, তবে আপনার হত্যার ফলে ক্রমান্বয়ে আরও কঠোর হওয়ার কারণে আরও বিশ্লেষণ করতে হবে।
slm

@ এসএলএম, আপনার kill -9যখনই সম্ভব এড়ানো উচিত কারণ এটি প্রোগ্রামটিকে সঠিকভাবে পরিষ্কার করার সুযোগ না দিয়ে কেবল প্লাগটিকে টান দেয়। আমি কিছু বিকল্প দিয়ে আপডেট করব।
গ্রীম

যেমনটি আমি বলেছিলাম যে আপনার গন্ধটি নরম হয় তবে আমি যা পরামর্শ দিয়েছি তা হ'ল ঝুঁকির দৃষ্টিকোণ থেকে সহ্য করতে ইচ্ছুক আপনি যা করতে চেষ্টা করছেন তা নেমে আসে। আমি আপনার পদ্ধতিটি আমার পাশাপাশি ব্যবহার করেছি। তারা উভয়ই সঠিক আইএমও। এছাড়াও ক kill ..; sleep <time>; kill -18 ..; ঘুম <সময়>; হত্যা -9 ... . Basically working up to the -9`।
slm

@ এসএলএম, এটি kill -18অবশ্যই এমন একটি জিনিস যা ব্যবহার বন্ধ করা উচিত কারণ এটি কাজ বন্ধ করে দেওয়া সাধারণ (এবং কিছু ক্ষেত্রে এটি প্রদর্শিত হয় যে bashপ্রেরণের আগে কোনওভাবে চলমান কাজ বন্ধ করে দেয় SIGTERM)। উপরে SIGHUPযেমন যুক্ত করা হয়েছে তেমনি চেষ্টা করাও কার্যকর যেহেতু অনেকগুলি প্রোগ্রাম যা অন্যদের প্রতিক্রিয়া জানায় না এটির প্রতিক্রিয়া জানায় (শেল দিয়ে এটি চেষ্টা করুন)। এর বাইরে যদিও হ্যাঁ, এটি এতটা সার্থক নয় SIGKILLকারণ সম্ভবত এটি অনিবার্য।
গ্রিম

0

এটি আপনার বর্তমান শেলের সমস্ত কাজ একের পর এক সমাপ্ত করবে:

while kill %; do :; done

ব্যাখ্যা: %তালিকার শেষ কাজটিকে বোঝায়, সুতরাং এটি killশূন্য-বহিরাগত মান না ফেরানো পর্যন্ত লুপ হয়ে যাবে , যার অর্থ এই হবে যে শেষ করার মতো আর কোনও কাজ নেই।

অন্য পদ্ধতির প্রথমে প্রেরণ হতে পারে SIGTERM, তারপরে SIGCONTআপনার চাকরি চালিয়ে যেতে পারে এবং তারা যা করবে প্রথম জিনিসটি হ'ল আপনার SIGTERM

/bin/kill $(jobs -p) && /bin/kill -CONT $(jobs -p)

(কোনও কারণে অন্তর্নির্মিতটি killঅদ্ভুত, তাই আমি এখানে বাহ্যিক ব্যবহার করেছি)।

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