কোনও প্রক্রিয়া আইডি (পিআইডি) বিদ্যমান কিনা তা পরীক্ষা করে দেখুন


184

বাশ স্ক্রিপ্টে, আমি নিম্নলিখিতগুলি করতে চাই (সিউডো কোডে):

if [ a process exists with $PID ]; then

    kill $PID 

fi

শর্তাধীন বিবৃতি জন্য উপযুক্ত অভিব্যক্তি কি?

উত্তর:


182

প্রক্রিয়াটির অস্তিত্ব পরীক্ষা করতে, ব্যবহার করুন

kill -0 $pid

তবে @ ইউনুইন্ড যেমন বলেছিল, আপনি যদি এটি যাইহোক হত্যা করতে যাচ্ছেন তবে ঠিক

kill $pid

অথবা আপনার একটি রেসের শর্ত থাকবে।

আপনি যদি পাঠ্য আউটপুটটিকে উপেক্ষা করতে killএবং প্রস্থান কোডের উপর ভিত্তি করে কিছু করতে চান তবে আপনি পারেন

if ! kill $pid > /dev/null 2>&1; then
    echo "Could not send SIGTERM to process $pid" >&2
fi

1
ম্যান পেজটির দিকে তাকালে, কিল -0 হ'ল: "সিগন্যাল প্রেরণ করা যেতে পারে কিনা যদি প্রস্থান কোডটি নির্দেশ করে" তাহলে এই বাস্তবতা কোনও প্রক্রিয়াটিকে হত্যা করে, বা কেবল এটি হত্যা করা যেতে পারে কিনা তা আপনাকে জানায়?
রিচার্ড এইচ

23
killকিছুটা ভুল নাম দেওয়া হয়েছে যে এটি প্রয়োজনীয়ভাবে প্রক্রিয়াটি মারে না। এটি প্রক্রিয়াটি কেবল একটি সংকেত প্রেরণ করে। kill $PIDসমতুল্য kill -15 $PID, যা প্রক্রিয়ায় সিগন্যাল 15, SIGTERM প্রেরণ করে, যা সমাপ্ত করার নির্দেশ। কোনও সিগন্যাল 0 নেই, killএটি প্রক্রিয়াতে কোনও সংকেত প্রেরণ করা যেতে পারে কিনা তা যাচাই করে দেখার জন্য একটি বিশেষ মান , যা বেশিরভাগ উদ্দেশ্যে এটি উপস্থিত রয়েছে কিনা তা যাচাই করার কমবেশি সমান। দেখুন linux.die.net/man/2/kill এবং linux.die.net/man/7/signal
Christoffer Hammarström

43
এটিতে সমস্যা রয়েছে যে যদি প্রক্রিয়াটি চলমান ব্যবহারকারীর মালিকানা না থাকে তবে আপনার কাছে কিল -0 কল করার অনুমতি থাকতে পারে না। পিএস-পি $ পিআইডি> / ডিভেল / নাল 2> & 1 ব্যবহার করা আরও ভাল যা আপনাকে সিগন্যাল প্রেরণের অনুমতি না থাকলেও প্রক্রিয়া স্থিতি দেখতে দেয়।
এমকোসোস

6
@ ম্যাককোস: সেক্ষেত্রে সে এটিকে যাইহোক হত্যা করতে পারে না।
ক্রিস্টোফার হামারস্ট্রিম

2
সুতরাং, আমি অনুমান করি - ব্যবহার করার জন্য kill -0, আমাকে আসলে এটি করতে হবে: kill -0 25667 ; echo $?- এবং তারপরে যদি আমি 0ফিরে পাই তবে সেই পিআইডি সহ প্রক্রিয়াটি হত্যা করা যেতে পারে; আর যদি প্রক্রিয়া PID, (বলুন) বিদ্যমান নয়, $?হতে হবে 1, একটি ব্যর্থতা নির্দেশ করে। এটা কি ঠিক?
sdaau

264

সবচেয়ে ভাল উপায়:

if ps -p $PID > /dev/null
then
   echo "$PID is running"
   # Do something knowing the pid exists, i.e. the process with $PID is running
fi

সমস্যা:

kill -0 $PID

পিড চলমান থাকলেও যদি আপনার এটিকে মেরে ফেলার অনুমতি না থাকে তবে প্রস্থান কোডটি শূন্য নয়। উদাহরণ স্বরূপ:

kill -0 1

এবং

kill -0 $non-running-pid

সাধারণ ব্যবহারকারীর জন্য একটি অবিচ্ছেদ্য (অ-শূন্য) প্রস্থান কোড রয়েছে তবে init প্রক্রিয়া (পিআইডি 1) অবশ্যই চলছে।

আলোচনা

কিল এবং বর্ণের পরিস্থিতি নিয়ে আলোচনা করা উত্তরগুলি ঠিক সঠিক হয় যদি পরীক্ষার বডিটি "কিল" হয়। আমি জেনারেলটির সন্ধান করতে এসেছি "আপনি কীভাবে বাশে পিআইডি অস্তিত্বের জন্য পরীক্ষা করেন "।

/ প্রোক পদ্ধতিটি আকর্ষণীয়, তবে কিছুটা অর্থে "পিএস" কমান্ড বিমূর্তকরণের স্পিরিটটি ভেঙে যায়, অর্থাৎ আপনাকে / প্রোকে অনুসন্ধান করার দরকার নেই কারণ লিনাস যদি "এক্সি" ফাইলটিকে অন্য কিছু বলার সিদ্ধান্ত নেন?


1
PS -p সর্বদা আমার জন্য 0 এর স্থিতি ফেরত দেয়
IttayD

1
PS -p #### উবুন্টু 14.04 এর অধীনে আমার পক্ষে ভাল কাজ করেছে, +1 ধন্যবাদ!
লিগামার

3
PS -p সর্বদা ওএস এক্স-তে স্থিতি কোড 0 ফেরত দেয় কারণ এটি কোনও চলমান প্রক্রিয়ার সাথে মেলে না এমন সময় প্রক্রিয়াটির একটি খালি তালিকা মুদ্রণ করে
ডগলাস কোরিয়া

আমি নিশ্চিত করতে পারি যে ম্যাকস সিয়েরায় এটি কাজ করে। এছাড়াও, -pঅন্তত সেই ক্ষেত্রে অপ্রয়োজনীয়। ps $PIDঠিক একই ফলাফল আছে।
ব্যবহারকারী 137369

পোর্টাবিলিটি / প্রোক ব্যবহার না করা একটি ভাল কারণ, তবে লিনাক্স এর এবিআই ভেঙে এমন একটি পরিস্থিতি নয় যা আমি বিশেষত উদ্বিগ্ন হব।
ডেভিড রাউন্ডি

67
if [ -n "$PID" -a -e /proc/$PID ]; then
    echo "process exists"
fi

অথবা

if [ -n "$(ps -p $PID -o pid=)" ]

পরবর্তী আকারে, -o pid=একটি শিরোনাম ছাড়াই কেবল প্রক্রিয়া আইডি কলাম প্রদর্শন করতে একটি আউটপুট ফর্ম্যাট। বৈধ ফলাফল দেওয়ার জন্য খালি খালি স্ট্রিং অপারেটরের জন্য উদ্ধৃতিগুলি প্রয়োজনীয়-n


1
দ্বিতীয় পদ্ধতিটি ম্যাকের উপরেও যুক্ত হওয়া প্লাস হিসাবে কাজ করে (ম্যাক ওএস এক্সের কোনও / প্রোক এফএস নেই)। আপনি, তবে, একটি subshell ব্যবহার এড়িয়ে এবং এর উভয় Mac এবং Linux এই ব্যবহার করতে পারেন:if ps -p"$PID" -o "pid=" >/dev/null 2>&1; then echo "Process is running..."; fi
উইল

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

1
যদি $PIDখালি থাকে তবে [ -e /proc/$PID ]এখনও সত্যটি ফিরে আসবে, যেহেতু /proc/ডিরেক্টরিটি এখনও বিদ্যমান রয়েছে।
ম্যাগনে

34

psকমান্ড সহ এটি -p $PIDকরতে পারে:

$ ps -p 3531
  PID TTY          TIME CMD
 3531 ?        00:03:07 emacs

11

আপনার দুটি উপায় আছে:

আমার ল্যাপটপে একটি নির্দিষ্ট অ্যাপ্লিকেশন সন্ধান শুরু করুন:

[root@pinky:~]# ps fax | grep mozilla
 3358 ?        S      0:00  \_ /bin/sh /usr/lib/firefox-3.5/run-mozilla.sh /usr/lib/firefox-3.5/firefox
16198 pts/2    S+     0:00              \_ grep mozilla

সমস্ত উদাহরণ এখন পিআইডি 3358 এর জন্য দেখাবে।

প্রথম উপায় : "পিএস অক্স" চালান এবং দ্বিতীয় কলামে পিআইডি-র জন্য গ্রেপ করুন। এই উদাহরণে আমি ফায়ারফক্সের সন্ধান করি এবং তারপরে এটি পিআইডি:

[root@pinky:~]# ps aux | awk '{print $2 }' | grep 3358
3358

সুতরাং আপনার কোডটি হবে:

if [ ps aux | awk '{print $2 }' | grep -q $PID 2> /dev/null ]; then
    kill $PID 
fi

দ্বিতীয় উপায় : কেবল /proc/$PIDডিরেক্টরিতে কিছু সন্ধান করুন । আমি এই উদাহরণে "এক্সি" ব্যবহার করছি তবে আপনি অন্য কিছু ব্যবহার করতে পারেন।

[root@pinky:~]# ls -l /proc/3358/exe 
lrwxrwxrwx. 1 elcuco elcuco 0 2010-06-15 12:33 /proc/3358/exe -> /bin/bash

সুতরাং আপনার কোডটি হবে:

if [ -f /proc/$PID/exe ]; then
    kill $PID 
fi

বিটিডাব্লু: এর সাথে kill -9 $PID || trueকী হয়েছে?


সম্পাদনা করুন:

এটি কয়েক মাস ধরে চিন্তা করার পরে .. (প্রায় 24 ...) আমি এখানে যে আসল ধারণাটি দিয়েছি তা একটি দুর্দান্ত হ্যাক, তবে অত্যন্ত অপ্রয়োজনীয়। যদিও এটি লিনাক্সের কয়েকটি প্রয়োগের বিবরণ শেখায়, এটি ম্যাক, সোলারিস বা * বিএসডি তে কাজ করতে ব্যর্থ হবে। এটি ভবিষ্যতের লিনাক্স কার্নেলগুলিতেও ব্যর্থ হতে পারে। দয়া করে - অন্যান্য প্রতিক্রিয়াগুলিতে বর্ণিত হিসাবে "পিএস" ব্যবহার করুন।


কমপক্ষে কিল -9 অংশটি ভুল বলে মনে হচ্ছে (উপ-প্রক্রিয়াগুলি হত্যা করে না)
নুরেটিন

প্রথম উপায়টি ব্যবহার করার সময় আমি কেন [: অনুপস্থিত `] 'পাই?
দশমাইল

1
/proc/$PID/exeকোনও নিয়মিত ফাইল নয়। সুতরাং, [ -f /proc/$PID/exe ]সর্বদা একটি falseফলাফল প্রদান করবে। ব্যবহার করে দেখুন [ -h /proc/$PID/exe ]
আলেকজান্ডার ইয়ানচারুক

8

মনে হচ্ছে আপনি চান

wait $PID

যা $pidশেষ হলে ফিরে আসবে ।

অন্যথায় আপনি ব্যবহার করতে পারেন

ps -p $PID

প্রক্রিয়াটি এখনও বেঁচে আছে কিনা তা পরীক্ষা করে দেখুন ( kill -0 $pidএটি পিডের মালিক না হলেও এটি কাজ করবে তার চেয়ে বেশি কার্যকর )।


1
অপেক্ষা এতটা কার্যকর নয় কারণ প্রক্রিয়াটি বর্তমান শেলের শিশু হওয়া উচিত বা এটি দেবে:pid 123 is not a child of this shell
কলুমাহ

7

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


দুর্ভাগ্যক্রমে কিল (1) এর প্রস্থান কোডটি বিভিন্ন ত্রুটি পরিস্থিতিগুলির মধ্যে পার্থক্য করে না (দেখে মনে হচ্ছে এটি প্রতিটি প্রক্রিয়াটির জন্য প্রস্থান মূল্যকে বৃদ্ধি করে যা এটি সিগন্যাল করতে ব্যর্থ হয়)। যদি ওপি তাদের নিজস্ব কিল (২) মোড়ক লেখার বিষয়ে আপত্তি না করে, ব্যর্থ কিল (২) কলের পরে তিনি ইআরআরএনওর মানের ভিত্তিতে বিভিন্ন মান সহ এটি প্রস্থান করতে পারেন।
ঠিক কাউকে

এই মুহুর্তে আমি কোনও পরীক্ষা ছাড়াই খুন -9 করছি - আমি কেবল একটি ত্রুটি পেয়েছি "প্রক্রিয়াটি বিদ্যমান নেই" যদি এটি উপস্থিত না থাকে যা খুব পরিপাটি না হয়। আমি কীভাবে পরীক্ষা করব?
রিচার্ড এইচ

14
অযত্নে করবেন না kill -9। এটি কেবল তত্ক্ষণাত্ প্রক্রিয়াটিকে মেরে ফেললে এটিকে নিজের পরে পরিষ্কার করার কোনও সুযোগ দেয় না। পরিবর্তে killসমান যা ব্যবহার করুন kill -15। যদি এটি কাজ না করে, তবে আপনাকে কেন এবং কেবল সর্বশেষ ব্যবহার হিসাবে ব্যবহার করা উচিত kill -9
ক্রিস্টোফার হামারস্ট্রিম

0

এখানে আমি .pid নামক একটি ফাইলে পিআইডি সংরক্ষণ করি (যা ধরণের / চালানোর মতো / ...) এবং ইতিমধ্যে কার্যকর না হলে কেবল স্ক্রিপ্টটি সম্পাদন করে।

#!/bin/bash
if [ -f .pid ]; then
  read pid < .pid
  echo $pid
  ps -p $pid > /dev/null
  r=$?
  if [ $r -eq 0 ]; then
    echo "$pid is currently running, not executing $0 twice, exiting now..."
    exit 1
  fi
fi

echo $$ > .pid

# do things here

rm .pid

দ্রষ্টব্য: একটি রেসের শর্ত রয়েছে কারণ এটি কীভাবে পিড বলা হয় তা যাচাই করে না। যদি সিস্টেমটি পুনরায় চালু হয় এবং .pid উপস্থিত থাকে তবে ভিন্ন অ্যাপ্লিকেশন দ্বারা ব্যবহৃত হয় এটি 'অপ্রত্যাশিত পরিণতি' হতে পারে।


0

উদাহরণস্বরূপ, জিএনইউ / লিনাক্সে আপনি ব্যবহার করতে পারেন:

Pid=$(pidof `process_name`)

if [ $Pid > 0 ]; then

   do something
else

   do something
fi 

বা কিছু

Pin=$(ps -A | grep name | awk 'print $4}')
echo $PIN

এবং এটি আপনাকে অ্যাপটির নাম, আইডি ছাড়াই কেবল নাম দেখায়।


1
pidofনেতিবাচক পিআইডি কোনও অর্থ দেয় না, এবং আপনি হত্যা করতে পারবেন না বলে একটি নেতিবাচক সংখ্যা ফেরায় না init, সুতরাং আপনার শর্তসাপেক্ষে কোনও অর্থ হয় না (এবং >এটির পুনঃনির্দেশগুলি সম্পাদন করা থেকে বিরত রাখতে আপনার এড়াতে হবে)। আপনি একটি খালি ফলাফলের জন্য যাচাই করতে চান, তবে অবশ্যই, কোনও শালীন সরঞ্জামের মতো, pidofএটি কার্যকর হয়েছে কিনা তা জানাতে একটি প্রস্থান কোড নির্ধারণ করে, তাই সঠিক সমাধানটি হয় if Pid=$(pidof 'process_name'); then ...(যদি আপনাকে Pidপরে মূল্য প্রয়োজন না হয় ) কেবলif pidof 'process_name'; then...
ট্রিপলি

@ ট্রাইপ্লেই ঠিক বলেছেন pidofউদাহরণে বাশ কীভাবে testকাজ করে তা নিয়ে ভুল ধারণা রয়েছে । gnu.org/software/bash/manual/html_node/…
ব্রুনো ব্রোনোস্কি

0

নীচে কোডগুলি পরীক্ষা করে দেখুন যে আমার প্রক্রিয়াটি চলছে কিনা, যদি কিছুই না করে থাকে।

আসুন আমাজন এসকিউএস থেকে প্রতি ঘন্টা এবং শুধুমাত্র প্রক্রিয়াটি চলমান না থাকলে নতুন বার্তাগুলি চেক করি।

#!/bin/bash
PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep | awk '{print $2}')
if [[ -z $PID ]]; then
    /usr/bin/python2.7 /home/brian/djcode/proyectoONE/manage.py SES__boto3_sqs_read
else
    echo "do nothing, just smile =)"
fi
exit $?
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.