আমার একটি স্বাধীন প্ল্যাটফর্ম প্রয়োজন (লিনাক্স / ইউনিক্স | ওএসএক্স) শেল / ব্যাশ কমান্ড যা নির্দিষ্ট প্রক্রিয়া চলছে কিনা তা নির্ধারণ করবে। যেমন mysqld
, httpd
... এটি করার সহজতম উপায় / আদেশ কী?
আমার একটি স্বাধীন প্ল্যাটফর্ম প্রয়োজন (লিনাক্স / ইউনিক্স | ওএসএক্স) শেল / ব্যাশ কমান্ড যা নির্দিষ্ট প্রক্রিয়া চলছে কিনা তা নির্ধারণ করবে। যেমন mysqld
, httpd
... এটি করার সহজতম উপায় / আদেশ কী?
উত্তর:
যদিও pidof
এবং pgrep
নির্ধারণের কি চালাচ্ছে জন্য মহান হাতিয়ার, তারা উভয় কিছু অপারেটিং সিস্টেমে অনুপলব্ধ, দুর্ভাগ্যবশত। একটি নির্দিষ্ট ব্যর্থ নিরাপদ নিম্নলিখিত ব্যবহার করা হবে:ps cax | grep command
জেন্টু লিনাক্সের আউটপুট:
14484? এস 0:00 এপাচে 2 14667? এস 0:00 এপাচে 2 19620? এসএল 0:00 এপাচি 2 21132? এসএস 0:04 অ্যাপাচি 2
ওএস এক্স এর ফলাফল:
42582 ?? জেড 0: 00.00 (এসএমসিলেট) 46529 ?? জেড 0: 00.00 (এসএমসিলেট) 46539 ?? জেড 0: 00.00 (এসএমসিলেট) 46547 ?? জেড 0: 00.00 (এসএমসিলেট) 46586 ?? জেড 0: 00.00 (এসএমসিলেট) 46594 ?? জেড 0: 00.00 (এসএমসিলেট)
লিনাক্স এবং ওএস এক্স, উভয়তেই গ্রেপ একটি প্রস্থান কোড ফেরত দেয় যাতে প্রক্রিয়াটি পাওয়া যায় কি না তা পরীক্ষা করা সহজ:
#!/bin/bash
ps cax | grep httpd > /dev/null
if [ $? -eq 0 ]; then
echo "Process is running."
else
echo "Process is not running."
fi
তদতিরিক্ত, যদি আপনি পিআইডিগুলির তালিকাটি চান, আপনি সহজেই তাদের জন্য গ্রেপ করতে পারেন:
পিএস ক্যাক্স | গ্রেপ httpd | গ্রেপ -ও '^ [] * [0-9] *'
যার আউটপুট লিনাক্স এবং ওএস এক্স-তে সমান:
3519 3521 3523 3524
নিম্নলিখিতগুলির আউটপুটটি একটি খালি স্ট্রিং, এটি চালিত নয় এমন প্রক্রিয়াগুলির জন্য এই পদ্ধতিটিকে নিরাপদ করে তোলে:
প্রতিধ্বনি ps cax | grep aasdfasdf | grep -o '^[ ]*[0-9]*'
এই পদ্ধতির একটি সহজ ফাঁকা স্ট্রিং পরীক্ষা লেখার জন্য উপযুক্ত, তারপরেও আবিষ্কারকৃত পিআইডি দিয়ে পুনরাবৃত্তি করা।
#!/bin/bash
PROCESS=$1
PIDS=`ps cax | grep $PROCESS | grep -o '^[ ]*[0-9]*'`
if [ -z "$PIDS" ]; then
echo "Process not running." 1>&2
exit 1
else
for PID in $PIDS; do
echo $PID
done
fi
এক্সিকিউট করার অনুমতি (chmod + x চলমান) এবং একটি পরামিতি দিয়ে এটি চালিয়ে একটি ফাইল ("চলমান" নাম হিসাবে) এ সংরক্ষণ করে আপনি এটি পরীক্ষা করতে পারেন: ./running "httpd"
#!/bin/bash
ps cax | grep httpd
if [ $? -eq 0 ]; then
echo "Process is running."
else
echo "Process is not running."
fi
সতর্কতা !!!
দয়া করে মনে রাখবেন যে আপনি কেবল আউটপুটটি পার্সিং করছেন ps ax
যার অর্থ লিনাক্স আউটপুটে দেখা গেছে এটি কেবল প্রসেসের সাথে মেলে না, তবে সেই প্রোগ্রামটিতে যুক্তিত যুক্তিগুলিও নয়। আমি এই পদ্ধতিটি ব্যবহার করার সময় যথাসম্ভব সুনির্দিষ্ট হওয়ার পরামর্শ দিচ্ছি (উদাহরণস্বরূপ ./running "mysql"
'মাইএসকিএলডি' প্রক্রিয়াগুলির সাথেও মিলবে)। আমি which
যেখানে সম্ভব সেখানে একটি পূর্ণ পথের বিরুদ্ধে পরীক্ষা করতে ব্যবহার করার পরামর্শ দিচ্ছি ।
তথ্যসূত্র:
grep
এছাড়াও নিজেই চলমান (যেমন পাবেন ps cax | grep randomname
সবসময় 0 ফিরে আসবে কারণ grep
খুঁজে বের করে grep randomname
(আশা করি এই স্পষ্ট ...) এক ফিক্স প্রক্রিয়া নামের প্রথম অক্ষর, যেমন চারপাশের বর্গাকার বন্ধনী যোগ করা হয়। ps cax | grep [r]andomname
।
ps cax | rev | cut -f1 -d' ' | rev
সহজে পার্সিংয়ের জন্য কেবল নাম কলামটি প্রদর্শন করবে।
ps cax
পুরোপুরি কমান্ড নাম আউটপুট নাও পারে। যেমন এটি "ক্রোমিয়াম-ব্রাউজার" এর পরিবর্তে "ক্রোমিয়াম-ব্রাউজ" মুদ্রণ করে।
প্রক্রিয়া যুক্তিগুলিতে (যেমন pgrep "mysqld"
) কিছু ধরণের প্যাটার্ন স্বীকৃতি দেওয়ার চেষ্টা করে একটি প্রক্রিয়া সন্ধান করা একটি কৌশল যা শীঘ্রই বা পরে ব্যর্থ হওয়ার পরিণতি হয়। আপনার যদি দুটি মাইএসকিএলড চলছে? সেই পদ্ধতির কথা ভুলে যান। আপনি এটি সাময়িকভাবে সঠিকভাবে পেতে পারেন এবং এটি এক বা দুই বছর ধরে কাজ করতে পারে তবে তারপরে এমন কিছু ঘটে যা আপনি ভাবেননি।
শুধুমাত্র প্রক্রিয়া আইডি (পিড) সত্যই অনন্য।
আপনি যখন পটভূমিতে কিছু লঞ্চ করেন তখন সর্বদা পিড সংরক্ষণ করুন। বাশ-এ এটি $!
ব্যাশ ভেরিয়েবলের সাহায্যে করা যেতে পারে । এটি করে আপনি নিজেকে অনেক বেশি বাঁচাতে পারবেন।
সুতরাং এখন প্রশ্নটি হয়ে গেল কীভাবে পিড চলছে কিনা তা কীভাবে জানতে হবে।
সহজভাবে করুন:
PS -o pid = -p <পিড>
এটি পসিক্স এবং অতএব বহনযোগ্য। প্রক্রিয়া চলমান থাকলে এটি পিডটি নিজেই ফিরিয়ে দেবে বা প্রক্রিয়াটি চালু না থাকলে কিছুই ফিরিয়ে দেবে না। কমান্ডটি কঠোরভাবে বলতে গেলে একটি একক কলাম ফিরে আসবে, এটি pid
, তবে যেহেতু আমরা একটি খালি শিরোনাম শিরোনাম দিয়েছি (তত্ক্ষণাত সমান চিহ্নের পূর্ববর্তী জিনিসগুলি) এবং এটিই অনুরোধ করা একক কলাম তখন পিএস কমান্ড মোটেও শিরোনাম ব্যবহার করবে না। আমরা যা চাই তা কারণ এটি পার্সিংকে আরও সহজ করে তোলে।
এটি লিনাক্স, বিএসডি, সোলারিস ইত্যাদিতে কাজ করবে
অন্য কৌশলটি হ'ল উপরের ps
কমান্ডটি থেকে প্রস্থান মূল্য পরীক্ষা করা । প্রক্রিয়াটি চলমান থাকলে এটি শূন্য এবং যদি তা শূন্য নয় তবে এটি হওয়া উচিত। পসিক্স স্পেক বলছে যে ps
কোনও ত্রুটি দেখা দিলে অবশ্যই 0 থেকে প্রস্থান করা উচিত তবে এটি 'ত্রুটি' গঠনের বিষয়টি আমার কাছে অস্পষ্ট। সুতরাং আমি ব্যক্তিগতভাবে সেই কৌশলটি ব্যবহার করছি না যদিও আমি নিশ্চিত যে এটি সমস্ত ইউনিক্স / লিনাক্স প্ল্যাটফর্মগুলিতেও কাজ করবে।
grep <sometext>
কোনও প্রক্রিয়া সন্ধানের জন্য কিছু ফর্ম করতে হয় তবে আপনি প্রক্রিয়া শুরু করার সময় আপনি কিছু ভুল করেছেন, আইএমএইচও। আমি ওপির প্রশ্ন থেকে এটাই গ্রহণ করি যে প্রক্রিয়াটি কীভাবে শুরু হয় তার উপর অবশ্যই তাঁর নিয়ন্ত্রণ রয়েছে।
বেশিরভাগ লিনাক্স বিতরণে, আপনি ব্যবহার করতে পারেন pidof
(8)।
এটি নির্দিষ্ট প্রসেসের সমস্ত চলমান দৃষ্টান্তগুলির প্রসেস আইডিগুলি প্রিন্ট করবে, বা কোনও দৃষ্টান্ত চলমান না থাকলে কিছুই না।
উদাহরণস্বরূপ, আমার সিস্টেমে (আমার চারটি দৃষ্টান্ত bash
এবং একটি remmina
দৌড়ের উদাহরণ রয়েছে ):
$ pidof bash remmina
6148 6147 6144 5603 21598
অন্যান্য ইউনিটগুলিতে pgrep
বা অন্যের সংমিশ্রণে ps
এবং grep
একই জিনিস অর্জন করবে , অন্যরা যথাযথভাবে উল্লেখ করেছেন।
pidof httpd
রেড হ্যাট 5. কিন্তু আমার রেড হ্যাট 4 কাজ জরিমানা, pidof
উপস্থিত নেই :-(
এটি ইউনিক্স, বিএসডি এবং লিনাক্সের বেশিরভাগ স্বাদে কাজ করা উচিত:
PATH=/usr/ucb:${PATH} ps aux | grep httpd | grep -v grep
পরীক্ষিত:
PATH=...
]ps
। দ্বিতীয়টি এড়াতে grep
আমি পরামর্শ দিই:ps aux | grep [h]ttpd
grep
।
সবচেয়ে সহজ উপায় হল পিএস এবং গ্রেপ ব্যবহার করা:
command="httpd"
running=`ps ax | grep -v grep | grep $command | wc -l`
if [ running -gt 0 ]; then
echo "Command is running"
else
echo "Command is not running"
fi
যদি আপনার কমান্ডটিতে কিছু কমান্ড আর্গুমেন্ট থাকে তবে আপনি আগ্রহী নন এমন সম্ভাব্য অন্যান্য প্রক্রিয়াগুলি ফিল্টার করার জন্য আপনি 'গ্রেপ $ কমান্ড' এর পরে আরও 'গ্রেপ সেন্টিমিডি_আরজি 1' রাখতে পারেন।
উদাহরণ: সরবরাহিত যুক্তি সহ কোনও জাভা প্রক্রিয়াটি আমাকে দেখান:
-ডজভা.ইটিল.লগিং.কনফিগ.ফিল = লগিং.প্রেপার্টি
চলছে
ps ax | grep -v grep | grep java | grep java.util.logging.config.file=logging.properties | wc -l
ps cax
প্রয়োজনীয়তা বাদ দেয় grep -v
। সুতরাং উদাহরণস্বরূপ, আপনি ব্যবহার করতে পারেন: ps cax | grep java > /dev/null || echo "Java not running"
।
কেবলমাত্র একটি সামান্য সংযোজন: আপনি যদি -c
PS তে পতাকা যুক্ত করেন তবে আপনার grep -v
পরে গ্রিপ প্রক্রিয়া যুক্ত লাইনটি সরিয়ে ফেলতে হবে না । অর্থাৎ
ps acux | grep cron
বিএসডি-ইশ সিস্টেমে আপনার যে টাইপিংয়ের দরকার হবে তা হ'ল (এটিতে ম্যাকোএসএক্স অন্তর্ভুক্ত) আপনার -u
যদি কম তথ্যের প্রয়োজন হয় তবে আপনি এটিকে ছেড়ে যেতে পারেন।
এমন একটি সিস্টেমে যেখানে নেটিভ ps
কমান্ডের জেনেটিকস সিসভিতে ফিরে আসে, আপনি ব্যবহার করতে চান
ps -e |grep cron
বা
ps -el |grep cron
শুধু পিড এবং প্রক্রিয়া নাম ছাড়াও আরও একটি তালিকা রয়েছে। অবশ্যই আপনি -o <field,field,...>
বিকল্পটি মুদ্রণের জন্য নির্দিষ্ট ক্ষেত্রগুলি নির্বাচন করতে পারেন ।
বিভিন্ন পরামর্শ একসাথে রাখলে আমি সবচেয়ে পরিষ্কার সংস্করণটি প্রকাশ করতে সক্ষম হয়েছি (অবিশ্বস্ত গ্রেপ ছাড়াই যা শব্দের অংশগুলিকে ট্রিগার করে) হ'ল:
kill -0 $(pidof mysql) 2> /dev/null || echo "Mysql ain't runnin' message/actions"
কিল -0 প্রক্রিয়াটিকে হত্যা করে না তবে এটি উপস্থিত রয়েছে কিনা তা যাচাই করে এবং তারপরে সত্যটি ফিরে আসে, আপনার সিস্টেমে পিডোফ না থাকলে, প্রক্রিয়াটি চালু করার সময় পিডটি সংরক্ষণ করুন:
$ mysql &
$ echo $! > pid_stored
তাহলে স্ক্রিপ্টে:
kill -0 $(cat pid_stored) 2> /dev/null || echo "Mysql ain't runnin' message/actions"
আপনি যখন এটি চালু করবেন, এর পিআইডি $!
ভেরিয়েবলে রেকর্ড করা হবে । এই পিআইডি একটি ফাইলে সংরক্ষণ করুন।
তারপরে আপনার এই পিআইডি কোনও চলমান প্রক্রিয়ার সাথে মিলে যায় কিনা তা খতিয়ে দেখতে হবে। এখানে একটি সম্পূর্ণ কঙ্কাল লিপি আছে:
FILE="/tmp/myapp.pid"
if [ -f $FILE ];
then
PID=$(cat $FILE)
else
PID=1
fi
ps -o pid= -p $PID
if [ $? -eq 0 ]; then
echo "Process already running."
else
echo "Starting process."
run_my_app &
echo $! > $FILE
fi
এর উত্তরের ভিত্তিতে peterh
। প্রদত্ত পিআইডি চলছে কিনা তা জানার কৌশলটি ps -o pid= -p $PID
নির্দেশনায় রয়েছে।
এই পদ্ধতির ক্ষেত্রে কমান্ড 'পিএস', 'পিডোফ' ব্যবহার করা যেতে পারে এবং বিশ্রামটি উপলব্ধ নেই। আমি ব্যক্তিগতভাবে আমার সরঞ্জামগুলি / স্ক্রিপ্ট / প্রোগ্রামগুলিতে খুব ঘন ঘন ব্যবহার করি।
egrep -m1 "mysqld$|httpd$" /proc/[0-9]*/status | cut -d'/' -f3
কি চলছে তা নিয়ে সামান্য ব্যাখ্যা:
এটি এমন প্রক্রিয়াগুলির সংখ্যা মুদ্রণ করে যার ভিত্তি নামটি "ক্রোমিয়াম-ব্রাউজার":
ps -e -o args= | awk 'BEGIN{c=0}{
if(!match($1,/^\[.*\]$/)){sub(".*/","",$1)} # Do not strip process names enclosed by square brackets.
if($1==cmd){c++}
}END{print c}' cmd="chromium-browser"
যদি এটি "0" মুদ্রণ করে তবে প্রক্রিয়াটি চলমান নয়। কমান্ডটি অনুমান করে যে প্রক্রিয়া পথটিতে ব্রেকিং স্পেস নেই। আমি স্থগিত প্রক্রিয়া বা জম্বি প্রক্রিয়াগুলির সাথে এটি পরীক্ষা করিনি।
লিনাক্সের বিকল্প gwak
হিসাবে ব্যবহার করে পরীক্ষিত awk
।
কিছু উদাহরণ ব্যবহারের সাথে এখানে আরও বহুমুখী সমাধান রয়েছে:
#!/bin/sh
isProcessRunning() {
if [ "${1-}" = "-q" ]; then
local quiet=1;
shift
else
local quiet=0;
fi
ps -e -o pid,args= | awk 'BEGIN{status=1}{
name=$2
if(name !~ /^\[.*\]$/){sub(".*/","",name)} # strip dirname, if process name is not enclosed by square brackets.
if(name==cmd){status=0; if(q){exit}else{print $0}}
}END{exit status}' cmd="$1" q=$quiet
}
process='chromium-browser'
printf "Process \"${process}\" is "
if isProcessRunning -q "$process"
then printf "running.\n"
else printf "not running.\n"; fi
printf "Listing of matching processes (PID and process name with command line arguments):\n"
isProcessRunning "$process"
এখানে আমার সংস্করণ। বৈশিষ্ট্য:
লিপি:
#!/bin/bash
# $1 - cmd
# $2 - args
# return: 0 - no error, running; 1 - error, not running
function isRunning() {
for i in $(pidof $1); do
cat /proc/$i/cmdline | tr '\000' ' ' | grep -F -e "$2" 1>&2> /dev/null
if [ $? -eq 0 ]; then
return 0
fi
done
return 1
}
isRunning java "-Djava.util.logging.config.file=logging.properties"
if [ $? -ne 0 ]; then
echo "not running, starting..."
fi
উত্তরগুলির কোনওটিই আমার পক্ষে কার্যকর হয়নি, তাই আমার এখানে:
process="$(pidof YOURPROCESSHERE|tr -d '\n')"
if [[ -z "${process// }" ]]; then
echo "Process is not running."
else
echo "Process is running."
fi
ব্যাখ্যা:
|tr -d '\n'
এটি টার্মিনাল দ্বারা তৈরি ক্যারেজ রিটার্ন সরিয়ে দেয়। বাকীটি এই পোস্টের মাধ্যমে ব্যাখ্যা করা যেতে পারে ।
নিম্নলিখিত শেল ফাংশন, কেবলমাত্র পসিক্স স্ট্যান্ডার্ড কমান্ড এবং বিকল্পগুলির উপর ভিত্তি করে বেশিরভাগ (যদি না হয়) ইউনিক্স এবং লিনাক্স সিস্টেমের উপর কাজ করা উচিত। :
isPidRunning() {
cmd=`
PATH=\`getconf PATH\` export PATH
ps -e -o pid= -o comm= |
awk '$2 ~ "^.*/'"$1"'$" || $2 ~ "^'"$1"'$" {print $1,$2}'
`
[ -n "$cmd" ] &&
printf "%s is running\n%s\n\n" "$1" "$cmd" ||
printf "%s is not running\n\n" $1
[ -n "$cmd" ]
}
$ isPidRunning httpd
httpd is running
586 /usr/apache/bin/httpd
588 /usr/apache/bin/httpd
$ isPidRunning ksh
ksh is running
5230 ksh
$ isPidRunning bash
bash is not running
নোট করুন যে সন্দেহজনক "0]" কমান্ডের নামটি পাস করার সময় এটি শ্বাসরোধ করবে এবং তাদের নামে এমবেডেড স্থান রয়েছে এমন প্রক্রিয়াগুলি সনাক্ত করতে ব্যর্থ হবে।
এটিও লক্ষ করুন যে সর্বাধিক উত্সাহিত এবং গ্রহণযোগ্য সমাধানটি বহনযোগ্য ps
বিকল্পগুলির জন্য দাবি করে এবং কৃতজ্ঞতার সাথে একটি শেল ব্যবহার করে যা এর জনপ্রিয়তা সত্ত্বেও প্রতিটি ইউনিক্স / লিনাক্স মেশিনে উপস্থিত থাকার নিশ্চয়তা দেয় না ( bash
)
$ isPidRunning 0]
প্রিন্টগুলি যেমন "0] চলছে 3 [ksoftirqd / 0] 8 [rcuop / 0] 17 [rcuos / 0] 26 [rcuob / 0] 34 [মাইগ্রেশন / 0] 35 [নজরদারি / 0]" এখানে।