বাশ স্ক্রিপ্টে, আমি নিম্নলিখিতগুলি করতে চাই (সিউডো কোডে):
if [ a process exists with $PID ]; then
kill $PID
fi
শর্তাধীন বিবৃতি জন্য উপযুক্ত অভিব্যক্তি কি?
বাশ স্ক্রিপ্টে, আমি নিম্নলিখিতগুলি করতে চাই (সিউডো কোডে):
if [ a process exists with $PID ]; then
kill $PID
fi
শর্তাধীন বিবৃতি জন্য উপযুক্ত অভিব্যক্তি কি?
উত্তর:
প্রক্রিয়াটির অস্তিত্ব পরীক্ষা করতে, ব্যবহার করুন
kill -0 $pid
তবে @ ইউনুইন্ড যেমন বলেছিল, আপনি যদি এটি যাইহোক হত্যা করতে যাচ্ছেন তবে ঠিক
kill $pid
অথবা আপনার একটি রেসের শর্ত থাকবে।
আপনি যদি পাঠ্য আউটপুটটিকে উপেক্ষা করতে kill
এবং প্রস্থান কোডের উপর ভিত্তি করে কিছু করতে চান তবে আপনি পারেন
if ! kill $pid > /dev/null 2>&1; then
echo "Could not send SIGTERM to process $pid" >&2
fi
kill
কিছুটা ভুল নাম দেওয়া হয়েছে যে এটি প্রয়োজনীয়ভাবে প্রক্রিয়াটি মারে না। এটি প্রক্রিয়াটি কেবল একটি সংকেত প্রেরণ করে। kill $PID
সমতুল্য kill -15 $PID
, যা প্রক্রিয়ায় সিগন্যাল 15, SIGTERM প্রেরণ করে, যা সমাপ্ত করার নির্দেশ। কোনও সিগন্যাল 0 নেই, kill
এটি প্রক্রিয়াতে কোনও সংকেত প্রেরণ করা যেতে পারে কিনা তা যাচাই করে দেখার জন্য একটি বিশেষ মান , যা বেশিরভাগ উদ্দেশ্যে এটি উপস্থিত রয়েছে কিনা তা যাচাই করার কমবেশি সমান। দেখুন linux.die.net/man/2/kill এবং linux.die.net/man/7/signal
kill -0
, আমাকে আসলে এটি করতে হবে: kill -0 25667 ; echo $?
- এবং তারপরে যদি আমি 0
ফিরে পাই তবে সেই পিআইডি সহ প্রক্রিয়াটি হত্যা করা যেতে পারে; আর যদি প্রক্রিয়া PID, (বলুন) বিদ্যমান নয়, $?
হতে হবে 1
, একটি ব্যর্থতা নির্দেশ করে। এটা কি ঠিক?
সবচেয়ে ভাল উপায়:
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) অবশ্যই চলছে।
কিল এবং বর্ণের পরিস্থিতি নিয়ে আলোচনা করা উত্তরগুলি ঠিক সঠিক হয় যদি পরীক্ষার বডিটি "কিল" হয়। আমি জেনারেলটির সন্ধান করতে এসেছি "আপনি কীভাবে বাশে পিআইডি অস্তিত্বের জন্য পরীক্ষা করেন "।
/ প্রোক পদ্ধতিটি আকর্ষণীয়, তবে কিছুটা অর্থে "পিএস" কমান্ড বিমূর্তকরণের স্পিরিটটি ভেঙে যায়, অর্থাৎ আপনাকে / প্রোকে অনুসন্ধান করার দরকার নেই কারণ লিনাস যদি "এক্সি" ফাইলটিকে অন্য কিছু বলার সিদ্ধান্ত নেন?
-p
অন্তত সেই ক্ষেত্রে অপ্রয়োজনীয়। ps $PID
ঠিক একই ফলাফল আছে।
if [ -n "$PID" -a -e /proc/$PID ]; then
echo "process exists"
fi
অথবা
if [ -n "$(ps -p $PID -o pid=)" ]
পরবর্তী আকারে, -o pid=
একটি শিরোনাম ছাড়াই কেবল প্রক্রিয়া আইডি কলাম প্রদর্শন করতে একটি আউটপুট ফর্ম্যাট। বৈধ ফলাফল দেওয়ার জন্য খালি খালি স্ট্রিং অপারেটরের জন্য উদ্ধৃতিগুলি প্রয়োজনীয়-n
।
if ps -p"$PID" -o "pid=" >/dev/null 2>&1; then echo "Process is running..."; fi
ps
বিকল্পগুলি এবং বৈশিষ্ট্যগুলি প্ল্যাটফর্মগুলির মধ্যে পরিবর্তিত হয়, তাই এটি এখনও সম্পূর্ণ পোর্টেবল হয় না।
$PID
খালি থাকে তবে [ -e /proc/$PID ]
এখনও সত্যটি ফিরে আসবে, যেহেতু /proc/
ডিরেক্টরিটি এখনও বিদ্যমান রয়েছে।
আপনার দুটি উপায় আছে:
আমার ল্যাপটপে একটি নির্দিষ্ট অ্যাপ্লিকেশন সন্ধান শুরু করুন:
[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 ...) আমি এখানে যে আসল ধারণাটি দিয়েছি তা একটি দুর্দান্ত হ্যাক, তবে অত্যন্ত অপ্রয়োজনীয়। যদিও এটি লিনাক্সের কয়েকটি প্রয়োগের বিবরণ শেখায়, এটি ম্যাক, সোলারিস বা * বিএসডি তে কাজ করতে ব্যর্থ হবে। এটি ভবিষ্যতের লিনাক্স কার্নেলগুলিতেও ব্যর্থ হতে পারে। দয়া করে - অন্যান্য প্রতিক্রিয়াগুলিতে বর্ণিত হিসাবে "পিএস" ব্যবহার করুন।
/proc/$PID/exe
কোনও নিয়মিত ফাইল নয়। সুতরাং, [ -f /proc/$PID/exe ]
সর্বদা একটি false
ফলাফল প্রদান করবে। ব্যবহার করে দেখুন [ -h /proc/$PID/exe ]
।
মনে হচ্ছে আপনি চান
wait $PID
যা $pid
শেষ হলে ফিরে আসবে ।
অন্যথায় আপনি ব্যবহার করতে পারেন
ps -p $PID
প্রক্রিয়াটি এখনও বেঁচে আছে কিনা তা পরীক্ষা করে দেখুন ( kill -0 $pid
এটি পিডের মালিক না হলেও এটি কাজ করবে তার চেয়ে বেশি কার্যকর )।
pid 123 is not a child of this shell
আমি মনে করি এটি একটি খারাপ সমাধান, যা জাতিদের শর্তগুলির জন্য উন্মুক্ত। প্রক্রিয়াটি যদি আপনার পরীক্ষা এবং হত্যার আহ্বানের মধ্যে মারা যায়? তাহলে হত্যা ব্যর্থ হবে। তাহলে কেন সব ক্ষেত্রেই হত্যার চেষ্টা করবেন না, এবং এটির পুনরুদ্ধার মূল্যটি কীভাবে তা অনুসন্ধান করে তা পরীক্ষা করে দেখুন?
kill -9
। এটি কেবল তত্ক্ষণাত্ প্রক্রিয়াটিকে মেরে ফেললে এটিকে নিজের পরে পরিষ্কার করার কোনও সুযোগ দেয় না। পরিবর্তে kill
সমান যা ব্যবহার করুন kill -15
। যদি এটি কাজ না করে, তবে আপনাকে কেন এবং কেবল সর্বশেষ ব্যবহার হিসাবে ব্যবহার করা উচিত kill -9
।
এখানে আমি .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 উপস্থিত থাকে তবে ভিন্ন অ্যাপ্লিকেশন দ্বারা ব্যবহৃত হয় এটি 'অপ্রত্যাশিত পরিণতি' হতে পারে।
উদাহরণস্বরূপ, জিএনইউ / লিনাক্সে আপনি ব্যবহার করতে পারেন:
Pid=$(pidof `process_name`)
if [ $Pid > 0 ]; then
do something
else
do something
fi
বা কিছু
Pin=$(ps -A | grep name | awk 'print $4}')
echo $PIN
এবং এটি আপনাকে অ্যাপটির নাম, আইডি ছাড়াই কেবল নাম দেখায়।
pidof
নেতিবাচক পিআইডি কোনও অর্থ দেয় না, এবং আপনি হত্যা করতে পারবেন না বলে একটি নেতিবাচক সংখ্যা ফেরায় না init
, সুতরাং আপনার শর্তসাপেক্ষে কোনও অর্থ হয় না (এবং >
এটির পুনঃনির্দেশগুলি সম্পাদন করা থেকে বিরত রাখতে আপনার এড়াতে হবে)। আপনি একটি খালি ফলাফলের জন্য যাচাই করতে চান, তবে অবশ্যই, কোনও শালীন সরঞ্জামের মতো, pidof
এটি কার্যকর হয়েছে কিনা তা জানাতে একটি প্রস্থান কোড নির্ধারণ করে, তাই সঠিক সমাধানটি হয় if Pid=$(pidof 'process_name'); then ...
(যদি আপনাকে Pid
পরে মূল্য প্রয়োজন না হয় ) কেবলif pidof 'process_name'; then...
pidof
উদাহরণে বাশ কীভাবে test
কাজ করে তা নিয়ে ভুল ধারণা রয়েছে । gnu.org/software/bash/manual/html_node/…
নীচে কোডগুলি পরীক্ষা করে দেখুন যে আমার প্রক্রিয়াটি চলছে কিনা, যদি কিছুই না করে থাকে।
আসুন আমাজন এসকিউএস থেকে প্রতি ঘন্টা এবং শুধুমাত্র প্রক্রিয়াটি চলমান না থাকলে নতুন বার্তাগুলি চেক করি।
#!/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 $?