নুহপ প্রসেসটি মারতে কীভাবে প্রসেস আইডি পাবেন?


204

আমি সার্ভারে নোহুপ প্রক্রিয়া চালাচ্ছি। আমি যখন এটি মারার চেষ্টা করি তখন আমার পুটি কনসোলটি পরিবর্তিত হয়ে যায়।

এইভাবে আমি প্রক্রিয়া আইডিটি সন্ধান করার চেষ্টা করি:

ps -ef |grep nohup 

এই হত্যার আদেশ

 kill -9 1787 787

6
আপনি কি এটি কোনও স্ক্রিপ্ট থেকে বা কমান্ড লাইনে হত্যা করার চেষ্টা করছেন? হয় হয় আপনার পিআইডি সংরক্ষণ করতে হবে nohupএবং পরে এটি ব্যবহার করার পরে kill, বা ps -efআউটপুটে এর কমান্ড নাম দ্বারা প্রক্রিয়াটি খুঁজে পেতে এবং সেখান থেকে পিআইডি পেতে হবে। আপনাকে কমান্ডের নামটি সন্ধান করতে হবে, না nohup
লুকার

1
@ এমব্র্যাচ আপনার মন্তব্যের পরিবর্তে উত্তর দেওয়া উচিত।
আনসার ভিচার্স

@ অ্যাঙ্গারওয়াইচার্স এই পরামর্শের জন্য ধন্যবাদ। কখনও কখনও যদি আমার প্রতিক্রিয়া খুব সংক্ষিপ্ত হয়, বা যদি আমি নিশ্চিত না যে এটি ওপি যা জিজ্ঞাসা করছে তা পুরোপুরি coveringেকে দিচ্ছে, তবে আমি উত্তর হিসাবে পোস্ট করতে দ্বিধা বোধ করছি। আমি একটি উত্তর যুক্ত করেছি এবং আরও তথ্য অন্তর্ভুক্ত করেছি।
লুকার

উত্তর:


353

আপনি যখন nohupকাজটি পটভূমিতে রেখেছেন তখন পটভূমি অপারেটর ( &) আপনাকে কমান্ড প্রম্পটে পিআইডি দেবে। যদি আপনার পরিকল্পনাটি ম্যানুয়ালি প্রক্রিয়াটি পরিচালনা করার থাকে তবে আপনি সেই পিআইডি সংরক্ষণ করতে পারেন এবং প্রয়োজনে প্রক্রিয়াটি মারতে পরে এটি ব্যবহার করতে পারেন kill PIDবা kill -9 PID(যদি আপনাকে জোর করে হত্যা করতে হবে)। বিকল্পভাবে, আপনি পরে পিআইডি খুঁজে পেতে ps -ef | grep "command name"এবং সেখান থেকে পিআইডি সনাক্ত করতে পারেন । নোট করুন যে nohupকীওয়ার্ড / কমান্ড নিজেই psপ্রশ্নে কমান্ডের আউটপুটে উপস্থিত হবে না ।

আপনি যদি কোনও স্ক্রিপ্ট ব্যবহার করেন তবে আপনি এমন কিছু করতে পারেন:

nohup my_command > my.log 2>&1 &
echo $! > save_pid.txt

my_commandএটিতে আউটপুট সংরক্ষণ করে চালানো হবে my.log(একটি স্ক্রিপ্টে, $!শেষ হওয়া প্রক্রিয়ার পিআইডি উপস্থাপন করে)। এটি 2হ'ল স্ট্যান্ডার্ড ত্রুটির ( stderr) ফাইলের জন্য ফাইল বর্ণনাকারী এবং 2>&1শেলকে স্ট্যান্ডার্ড ত্রুটি আউটপুটকে স্ট্যান্ডার্ড আউটপুট (ফাইল বর্ণনাকারী 1) এ রুট করতে বলে । এটির জন্য এটি প্রয়োজন &1যাতে শেলটি কেবলমাত্র একটি ফাইলের পরিবর্তে সেই প্রসঙ্গে একটি ফাইল বর্ণনাকারী জানে 12>&1কোনো ত্রুটি বার্তা সাধারণত আমাদের মধ্যে মান ত্রুটি লেখা হয় ক্যাপচার প্রয়োজন হয় my.logফাইল (যেটি মান আউটপুট থেকে আসছে)। দেখুন , I / O পুনঃ দিকনির্দেশ আমি হে ফেরৎ শেল সঙ্গে / হ্যান্ডলিং আরও বিশদের জন্য।

কমান্ডটি যদি নিয়মিত ভিত্তিতে আউটপুট প্রেরণ করে tail my.logতবে আপনি মাঝে মাঝে আউটপুটটি পরীক্ষা করতে পারেন , বা যদি আপনি এটি "লাইভ" অনুসরণ করতে চান তবে আপনি এটি ব্যবহার করতে পারেন tail -f my.log। শেষ অবধি, যদি আপনার প্রক্রিয়াটি মারতে হয় তবে আপনি এটির মাধ্যমে এটি করতে পারেন:

kill -9 `cat save_pid.txt`
rm save_pid.txt

15
একটি সামান্য স্পষ্টতা, এটি nohupপ্রতি সে নয় , এটি পিআইডি প্রিন্ট করে, এটিই চূড়ান্ত, &যা এর ব্যাকগ্রাউন্ড, উদাহরণস্বরূপ ls &চলমান পিআইডি প্রদর্শন করবেls
কর্মকাজে

1
'2> & 1' কী করে?
ভিরাজ

4
@ ভিরাজ 2হ'ল "স্ট্যান্ডার্ড ত্রুটি" ফাইল বিবরণকারী । >শেলটি পুনর্নির্দেশ, এবং &1এটি "স্ট্যান্ডার্ড আউটপুট" ফাইল বিবরণকারী (এটি &এখানে প্রয়োজনীয় তাই শেলটি ভাববে না যে আমি নামের কোনও ফাইলটি উল্লেখ করছি 1)। সুতরাং 2 > &1কোনও মানক ত্রুটি আউটপুটকে স্ট্যান্ডার্ড ইনপুটটিতে পুনঃনির্দেশ করে। > my.logস্ট্যান্ডার্ড আউটপুটটিতে পুনঃনির্দেশ করার পূর্বের উপায়গুলি যেহেতু my.logত্রুটি বার্তাগুলিও চলেছে তা নিশ্চিত করার একটি উপায় আমাদের দরকার my.log2 > &1নিশ্চিত করে যে এই ধরনের ত্রুটিগুলি স্ট্যান্ডার্ড আউটপুটগুলিতে যায়, যার ফলস্বরূপ যায় my.log। দেখুন , I / O পুনঃ দিকনির্দেশ
লুক্কায়িত

6
echo $!প্রক্রিয়াটি বেড়ে যাওয়ার পরিবর্তে আমাকে নোহুপের পিড দেয়
নেহাল জে

1
@ মুভেরিসেক &কমান্ড ডিলিমিটার হিসাবে কাজ করে যাতে আপনি চেষ্টা করতে পারেন sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt",। এটি হয়ত কাজ করতে পারে, তবে আমি এটি চেষ্টা করি নি।
লুকোচুরি

91

আমি একটি ভিপিএস সার্ভারে লাল টুপি লিনাক্স ব্যবহার করছি (এবং এসএসএইচ - পুটি মাধ্যমে), আমার জন্য নিম্নলিখিতটি কাজ করেছে:

প্রথমত, আপনি সমস্ত চলমান প্রক্রিয়াগুলি তালিকাবদ্ধ করুন:

ps -ef

তারপরে প্রথম কলামে আপনি আপনার ব্যবহারকারীর নাম খুঁজে পাবেন; আমি এটি নিম্নলিখিত তিনবার পেয়েছি:

  • একটি ছিল এসএসএইচ সংযোগ
  • দ্বিতীয়টি ছিল একটি এফটিপি সংযোগ
  • শেষটি ছিল নোহুপ প্রক্রিয়া

তারপরে দ্বিতীয় কলামে আপনি নোহুপ প্রক্রিয়াটির পিআইডি খুঁজে পাবেন এবং আপনি কেবল টাইপ করুন:

kill PID 

(অবশ্যই নোহপ প্রক্রিয়াটির পিআইডি দিয়ে পিআইডি প্রতিস্থাপন করা)

আর এটাই!

আমি আশা করি যে এই উত্তরটি কারও পক্ষে কার্যকর হবে আমি বাশ এবং এসএসএইচ-তেও খুব নতুন, তবে আমার এখানে প্রয়োজনীয় জ্ঞানের 95% পাওয়া গেছে :)


3
আমি মনে করি আপনি এখানে ইউআইডি পরিবর্তে পিআইডি বোঝাতে চেয়েছিলেন?
wprins

আমি @Wprins এর সাথে একমত ইউআইডি মেরে ফেলা আমার পক্ষে কাজ করেনি, তবে পিআইডি হত্যার ঘটনা ঘটেছে।
রায়ান

আমার ক্ষেত্রে আমি নোহপ দিয়ে একটি পরীক্ষার শেল স্ক্রিপ্ট (লং_আরনিং_স্ক্রিপ্ট.শ) চালিয়েছিলাম এবং & কীভাবে এটি থামাতে হয় তা জানেন না। অবশেষে, আমি একটি পিএস-শেফ করেছি | গ্রেপ লং_রানিং * এবং পিআইডি ফাউন্ড করুন। তারপরে একটি পিআইডি মেরে
ফেললেন

50

ধরুন আমি নীচের কমান্ডের সাথে ব্যাকগ্রাউন্ডে রুবি স্ক্রিপ্ট চালাচ্ছি

nohup ruby script.rb &

তারপরে আমি কমান্ডের নাম উল্লেখ করে উপরের পটভূমি প্রক্রিয়াটির পিড পেতে পারি। আমার ক্ষেত্রে কমান্ড রুবি হয়।

ps -ef | grep ruby

আউটপুট

ubuntu   25938 25742  0 05:16 pts/0    00:00:00 ruby test.rb

এখন আপনি কমান্ড কমান্ড ব্যবহার করে সহজেই প্রক্রিয়াটি মেরে ফেলতে পারেন

kill 25938

1
সঞ্জয়, ঠিক তাই আমি নিশ্চিত যে আমি কিছুই মিস করছি না, আপনার উত্তরের কোন অংশটি বছর পূর্বে সরবরাহ করা উত্তরগুলির চেয়ে নতুন বা আলাদা? ps -efএবং killউভয়ই ভালভাবে উপরে আচ্ছাদিত ছিল, সুতরাং নতুন অংশটি কী?
ডেভিড সি র্যাঙ্কিন

2
PS -ef আপনাকে আউটপুটটির দীর্ঘ তালিকা দেবে এবং এই দীর্ঘ তালিকা থেকে অনুসন্ধান করা কঠিন হবে। সুতরাং আমি PS -ef মনে করি | গ্রেড রুবি কেবল পিএস-শেফ করার চেয়ে পিড অনুসন্ধানের জন্য আরও ভাল কমান্ড
সঞ্জয়

20

কাজের -l আপনাকে নোহাপ প্রক্রিয়াগুলির তালিকার জন্য পিড দেওয়া উচিত। তাদের (-9) আলতো করে হত্যা করুন। ;)


11
কেবলমাত্র বর্তমান শেলটিতে কাজ শুরু করা হলে। এবং kill -9আপনি যদি না জানেন যে নিয়মিত সংকেতগুলি কাজ করে না unless
ট্রিপল

1
এটি দরকারী, যদি আপনি এমন কোনও ডকার ইমেজে থাকেন যেখানে পিএস ইনস্টল করা হয়নি :-)
অ্যান্ড্রিয়াস প্রফেস

5

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

kill -9 `pgrep [command name]`

2
খুব সুন্দর! আমি ব্যবহার করেছি pkill [command name]আপনি -oসবচেয়ে পুরানো ম্যাচিং প্রক্রিয়াটি হত্যার জন্য, বা -nপরিবর্তে নতুনটি ব্যবহার করতে পতাকাটি ব্যবহার করতে পারেন ।
zanona

4

এটি কাজ করে Ubuntu

এটি জানতে এটি টাইপ করুন PID

ps aux | grep java

জাভা সম্পর্কিত সমস্ত চলমান প্রক্রিয়া দেখানো হবে

আমার ক্ষেত্রে হয়

johnjoe      3315  9.1  4.0 1465240 335728 ?      Sl   09:42   3:19 java -jar batch.jar

এখন এটি হত্যা kill -9 3315

জম্বি প্রক্রিয়া অবশেষে বন্ধ হয়ে গেল।


4

মনে করুন আপনি নোহুপ দিয়ে একটি জাভা প্রোগ্রাম সম্পাদন করছেন তবে আপনি জাভা প্রক্রিয়া আইডি পেতে পারেন

`ps aux | grep java`

আউটপুট

xxxxx     9643  0.0  0.0  14232   968 pts/2   

তারপরে আপনি টাইপ করে প্রক্রিয়াটি মেরে ফেলতে পারেন

sudo kill 9643

বা বলুন যে আপনাকে সমস্ত জাভা প্রক্রিয়াগুলি মেরে ফেলতে হবে তারপরে কেবল ব্যবহার করুন

sudo killall java

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

sudo killall {processName}

2

আপনি যখন নোহুপে একটি কাজ তৈরি করবেন এটি আপনাকে প্রক্রিয়া আইডি বলবে!

nohup sh test.sh &

আউটপুট আপনাকে প্রসেস আইডির মতো প্রদর্শন করবে

25013

আপনি এটি তারপর হত্যা করতে পারেন:

kill 25013

1

আমি নিম্নলিখিত কমান্ড দিয়ে জাজানো সার্ভার শুরু করেছি।

nohup manage.py runserver <localhost:port>

এটি CentOS এ কাজ করে:

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 

process not foundনোহাপ দিয়ে বিভ্রান্তি সমাধানের জন্য এটিই যায় ।
কোডস্পেন্ট

0

আজ আমি একই সমস্যা পূরণ। এবং যেহেতু এটি অনেক দিন আগে ছিল, আমি কোন আদেশটি কখন এবং কখন ব্যবহার করেছি তা পুরোপুরি ভুলে গিয়েছিলাম। আমি তিনটি পদ্ধতি চেষ্টা করেছি:

  1. এতে প্রদর্শিত STIME ব্যবহার করা ps -efকমান্ড । এটি আপনার প্রক্রিয়া শুরু করার সময়টি দেখায় এবং আপনি সম্ভবত এসএসএস বন্ধ করার আগে আপনাকে কমান্ড দেওয়ার (সম্ভবত আপনার উপর নির্ভরশীল) সম্ভাবনা রয়েছে। দুর্ভাগ্যক্রমে আমি নোপআপ ব্যবহার করে চালিত কমান্ডটি সর্বশেষতম কমান্ড বলে মনে করি না, সুতরাং এটি আমার পক্ষে কার্যকর হয় না।
  2. দ্বিতীয়টি হ'ল পিপিআইডি, কমান্ডেও প্রদর্শিত হয় ps -ef। এর অর্থ প্যারেন্ট প্রসেস আইডি, প্রক্রিয়াটির আইডি যা প্রক্রিয়া তৈরি করে। পিপিড উবুন্টুতে প্রসেসের জন্য 1 যা চালানোর জন্য নোহুপ ব্যবহার করে। তারপরে আপনি ps --ppid "1"তালিকাটি পেতে ব্যবহার করতে পারেন এবং প্রক্রিয়াটির পিআইডি সন্ধানের জন্য টাইম (আপনার প্রক্রিয়াটি ব্যবহারের মোট সিপিইউ সময়) বা সিএমডি পরীক্ষা করতে পারেন।
  3. ব্যবহার করুন lsof -i:portযদি প্রক্রিয়া পোর্ট ব্যাপৃত, এবং আপনি কমান্ড পাবেন। তারপরে উপরের উত্তরের মতই ব্যবহার করুন ps -ef | grep commandএবং আপনি পিআইডি পাবেন।

একবার আপনি প্রক্রিয়াটির পিআইডি খুঁজে পাবেন, তারপরে kill pidপ্রক্রিয়াটি টার্মিনাল করতে ব্যবহার করতে পারেন ।

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