मुझे एक प्लेटफ़ॉर्म स्वतंत्र (लिनक्स / यूनिक्स | ओएसएक्स) शेल / बैश कमांड की आवश्यकता है जो यह निर्धारित करेगा कि क्या कोई विशिष्ट प्रक्रिया चल रही है। जैसे mysqld
, httpd
... ऐसा करने का सबसे सरल तरीका / आदेश क्या है?
मुझे एक प्लेटफ़ॉर्म स्वतंत्र (लिनक्स / यूनिक्स | ओएसएक्स) शेल / बैश कमांड की आवश्यकता है जो यह निर्धारित करेगा कि क्या कोई विशिष्ट प्रक्रिया चल रही है। जैसे mysqld
, httpd
... ऐसा करने का सबसे सरल तरीका / आदेश क्या है?
जवाबों:
जबकि pidof
और pgrep
क्या चल रहा है, यह निर्धारित करने के लिए महान उपकरण हैं, वे दोनों, दुर्भाग्य से, कुछ ऑपरेटिंग सिस्टम पर अनुपलब्ध हैं। एक निश्चित विफल सुरक्षित निम्नलिखित का उपयोग करने के लिए किया जाएगा:ps cax | grep command
Gentoo लिनक्स पर आउटपुट:
14484? एस 0:00 अपाचे 2 14667? एस 0:00 अपाचे 2 19620? Sl 0:00 अपाचे 2 21132? एसएस 0 अपाचे 2
OS X पर आउटपुट:
42582 ?? Z 0: 00.00 (smbclient) 46529 ?? Z 0: 00.00 (smbclient) 46539 ?? Z 0: 00.00 (smbclient) 46547 ?? Z 0: 00.00 (smbclient) 46586 ?? Z 0: 00.00 (smbclient) 46594 ?? Z 0: 00.00 (smbclient)
लिनक्स और OS X दोनों पर, grep एक निकास कोड देता है, ताकि यह जांचना आसान हो कि क्या प्रक्रिया पाई गई या नहीं:
#!/bin/bash
ps cax | grep httpd > /dev/null
if [ $? -eq 0 ]; then
echo "Process is running."
else
echo "Process is not running."
fi
इसके अलावा, यदि आप पीआईडी की सूची चाहते हैं, तो आप उन लोगों के लिए भी आसानी से तैयार कर सकते हैं:
ps cax | grep httpd | grep -o '^ [] * [0-9] *'
जिसका आउटपुट लिनक्स और OS X पर समान है:
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"
'mysqld' प्रक्रियाओं से भी मेल खाएगा)। मैं 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"
) पर कुछ प्रकार के पैटर्न मान्यता को करने की कोशिश करके एक प्रक्रिया खोजना एक ऐसी रणनीति है जो जल्द या बाद में विफल होने के लिए बर्बाद होती है। यदि आपके पास दो mysqld चल रहा है तो क्या होगा? उस दृष्टिकोण को भूल जाओ। आप इसे अस्थायी रूप से सही पाते हैं और यह एक या दो साल के लिए काम करता है, लेकिन फिर कुछ ऐसा होता है जिसके बारे में आपने सोचा नहीं है।
केवल प्रक्रिया आईडी (पीआईडी) वास्तव में अद्वितीय है।
जब आप बैकग्राउंड में कुछ लॉन्च करते हैं तो हमेशा पीड को स्टोर करें। बैश में यह $!
बैश वैरिएबल के साथ किया जा सकता है । ऐसा करने से आप खुद को SO बहुत परेशानी से बचा लेंगे।
तो अब सवाल बनता है कि कैसे पता करें कि क्या एक पिड चल रहा है।
बस करो:
ps -o pid = -p <pid>
यह POSIX है और इसलिए पोर्टेबल है। यदि प्रक्रिया चल रही है या प्रक्रिया नहीं चल रही है तो कुछ भी नहीं लौटाने पर यह स्वयं को वापस लौटा देगा। कड़ाई से बोलना कमांड एक कॉलम को लौटाएगा pid
, लेकिन जब से हमने दिया है कि एक खाली शीर्षक हेडर (सामान तुरंत समान चिह्न से पहले) और यह एकमात्र कॉलम है जो अनुरोध किया गया है तो पीएस कमांड हेडर का उपयोग बिल्कुल नहीं करेगा। जो हम चाहते हैं क्योंकि यह पार्स करना आसान बनाता है।
यह लिनक्स, बीएसडी, सोलारिस आदि पर काम करेगा।
एक अन्य रणनीति उपरोक्त ps
कमांड से बाहर निकलने के मूल्य पर परीक्षण करना होगा । यदि प्रक्रिया चल रही है और यह शून्य नहीं है तो यह शून्य होना चाहिए। POSIX कल्पना कहती है कि ps
यदि कोई त्रुटि हुई है तो 0 से बाहर निकलना चाहिए, लेकिन यह मेरे लिए अस्पष्ट है कि 'एक त्रुटि' क्या है। इसलिए मैं व्यक्तिगत रूप से उस रणनीति का उपयोग नहीं कर रहा हूं, हालांकि मुझे पूरा यकीन है कि यह सभी यूनिक्स / लिनक्स प्लेटफार्मों पर भी काम करेगा।
grep <sometext>
किसी दिए गए प्रक्रिया को खोजने के लिए कुछ करना पड़ता है तो आपने प्रक्रिया को शुरू करते समय कुछ गलत किया है, IMHO। मैं इसे ओपी के प्रश्न से लेता हूं कि वास्तव में इस पर उनका नियंत्रण है कि प्रक्रिया कैसे शुरू की जाती है।
अधिकांश लिनक्स वितरण पर, आप pidof
(8) का उपयोग कर सकते हैं ।
यह निर्दिष्ट प्रक्रियाओं के सभी चल रहे उदाहरणों की प्रक्रिया आईडी को प्रिंट करेगा, या अगर कोई उदाहरण नहीं चल रहा है तो कुछ भी नहीं।
उदाहरण के लिए, मेरे सिस्टम पर (मेरे पास चार उदाहरण हैं bash
और remmina
चलने का एक उदाहरण ):
$ pidof bash remmina
6148 6147 6144 5603 21598
अन्य यूनियनों, pgrep
या के संयोजन पर ps
और grep
उसी चीज को प्राप्त करेंगे, जैसा कि दूसरों ने सही बताया है।
pidof httpd
Red Hat 5 पर ठीक काम करता है। लेकिन मेरी Red Hat 4 पर, pidof
मौजूद नहीं है :-(
यह यूनिक्स, बीएसडी और लिनक्स के अधिकांश स्वादों पर काम करना चाहिए:
PATH=/usr/ucb:${PATH} ps aux | grep httpd | grep -v grep
पर परीक्षण किया गया:
PATH=...
]ps
। दूसरे से बचने के लिए grep
मैं सुझाव देता हूं:ps aux | grep [h]ttpd
grep
।
सबसे सरल तरीका है ps और 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
यदि आपकी कमांड में कुछ कमांड तर्क हैं, तो आप 'grep $ कमांड' के बाद 'grep cmd_arg1' को अन्य संभावित प्रक्रियाओं को फ़िल्टर करने के लिए भी रख सकते हैं, जिनमें आपकी रुचि नहीं है।
उदाहरण: अगर आपूर्ति तर्क के साथ कोई जावा प्रक्रिया मुझे दिखाओ:
-Djava.util.logging.config.file = logging.properties
दौड रहा है
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
बाद वाली grep प्रक्रिया वाली लाइन को हटाने की आवश्यकता नहीं है । अर्थात
ps acux | grep cron
सभी प्रकार की आपको bsd-ish प्रणाली पर (इसमें MacOSX शामिल है) आप -u
कम जानकारी की आवश्यकता होने पर दूर छोड़ सकते हैं।
ऐसी प्रणाली पर जहां मूल ps
कमांड का आनुवांशिकी SysV को इंगित करता है , आप उपयोग करेंगे
ps -e |grep cron
या
ps -el |grep cron
केवल pid और प्रक्रिया नाम से अधिक वाली सूची के लिए। बेशक आप -o <field,field,...>
विकल्प का उपयोग करके प्रिंट करने के लिए विशिष्ट क्षेत्रों का चयन कर सकते हैं ।
विभिन्न सुझावों को एक साथ रखते हुए, सबसे साफ संस्करण जिसे मैं (बिना अविश्वसनीय grep जो शब्दों के कुछ हिस्सों को चलाता है) के साथ आने में सक्षम था:
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"
मैं उपयोग करता हूं, pgrep -l httpd
लेकिन यह सुनिश्चित नहीं है कि यह किसी भी मंच पर मौजूद है ...
OSX पर कौन पुष्टि कर सकता है?
pidof
कृपया जाँच भी कर सकते हैं ? ठीक है आपने किया धन्यवाद। इसलिए हमें OSX पर काम करने के लिए कुछ और ढूंढना चाहिए ... आपका मूल ps|grep
एकल समाधान हो सकता है ;-)
जब आप इसे लॉन्च करते हैं, तो इसका पीआईडी $!
वैरिएबल में रिकॉर्ड किया जाएगा । इस PID को किसी फ़ाइल में सहेजें।
फिर आपको यह जांचने की आवश्यकता होगी कि क्या यह पीआईडी एक चल रही प्रक्रिया से मेल खाती है। यहाँ एक पूरी कंकाल लिपि है:
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
अनुदेश में है।
इस दृष्टिकोण का उपयोग कमांड कमांड 'ps', 'पिडोफ' में किया जा सकता है और बाकी उपलब्ध नहीं हैं। मैं अपने टूल / स्क्रिप्ट्स / प्रोग्राम्स में व्यक्तिगत रूप से बहुत बार procfs का उपयोग करता हूं।
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'
यह टर्मिनल द्वारा बनाई गई गाड़ी वापसी को हटा देता है। बाकी इस पोस्ट के द्वारा समझाया जा सकता है ।
निम्नलिखित शेल फ़ंक्शन, केवल POSIX मानक आदेशों और विकल्पों पर आधारित होने के कारण अधिकांश (यदि कोई नहीं है) यूनिक्स और लिनक्स सिस्टम पर काम करना चाहिए। :
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]" यहाँ।