मैं यह कैसे निर्धारित कर सकता हूं कि कोई प्रक्रिया चल रही है या नहीं और फिर उस शर्त के आधार पर कुछ सामान को निष्पादित करने के लिए बैश स्क्रिप्ट है?
उदाहरण के लिए:
यदि प्रक्रिया
abc
चल रही है, तो यह करेंयदि यह नहीं चल रहा है, तो ऐसा करें।
मैं यह कैसे निर्धारित कर सकता हूं कि कोई प्रक्रिया चल रही है या नहीं और फिर उस शर्त के आधार पर कुछ सामान को निष्पादित करने के लिए बैश स्क्रिप्ट है?
उदाहरण के लिए:
यदि प्रक्रिया abc
चल रही है, तो यह करें
यदि यह नहीं चल रहा है, तो ऐसा करें।
जवाबों:
कुछ ऐसा करने के लिए बैश स्क्रिप्ट कुछ इस तरह दिखाई देगी:
#!/bin/bash
# Check if gedit is running
# -x flag only match processes whose name (or command line if -f is
# specified) exactly match the pattern.
if pgrep -x "gedit" > /dev/null
then
echo "Running"
else
echo "Stopped"
fi
यह स्क्रिप्ट केवल यह देखने के लिए जाँच कर रही है कि क्या प्रोग्राम "gedit" चल रहा है।
या आप केवल यह देख सकते हैं कि कार्यक्रम इस तरह से नहीं चल रहा है:
if ! pgrep -x "gedit" > /dev/null
then
echo "Stopped"
fi
/dev/null
: "/ dev / null कमांड स्टैंडर्ड आउटपुट को null डिवाइस पर रीडायरेक्ट करता है, जो कि एक विशेष डिवाइस है, जो इसे लिखी गई जानकारी को डिस्क्राइब करता है" ... 0
कमांड आउटपुट को कमांड आउटपुट पर एक फाइल में रीडायरेक्ट करेगा 0
। इस मामले में, मैं सलाह > /dev/null
दूंगा कि आप अधिक आरामदायक बनें - आप इसे हर जगह देखेंगे, क्योंकि यह आउटपुट छोड़ने के लिए मानक / उचित तरीका है।
-x
पैरामीटर जोड़ें pgrep
ताकि वह सटीक एप्लिकेशन की तलाश कर रहा है या किसी अन्य ऐप के नाम के अंदर समान स्ट्रिंग पाए जाने पर उसे एक सही सही मिलेगा। मुझे यह पता लगाने में सिर्फ 1 घंटे का समय लगा।
! pgrep
कोई समाधान जो किसी चीज का उपयोग करता है ps aux | grep abc
या pgrep abc
त्रुटिपूर्ण है।
क्योंकि आप जाँच नहीं कर रहे हैं कि क्या कोई विशिष्ट प्रक्रिया चल रही है, आप जाँच रहे हैं कि क्या कोई प्रक्रिया चल रही है जो मिलान के लिए होती है abc
। कोई भी उपयोगकर्ता आसानी से एक निष्पादन योग्य नाम abc
(या जिसमें abc
उसका नाम या तर्क कहीं न कहीं शामिल है) बना सकता है और चला सकता है, जिससे आपके परीक्षण के लिए एक गलत सकारात्मक स्थिति पैदा हो सकती है। वहाँ विभिन्न विकल्पों आप आवेदन कर सकते हैं ps
, grep
और pgrep
खोज को सीमित करने के लिए, लेकिन आप अभी भी एक विश्वसनीय परीक्षण नहीं मिलेगा।
यह इस बात पर निर्भर करता है कि आपको परीक्षण के लिए क्या चाहिए।
यह क्या init और upstart के लिए है। वे सेवा शुरू करेंगे और यह सुनिश्चित करेंगे कि इसका पिड पीडिफाइल में संग्रहित हो। सेवा को फिर से शुरू करने की कोशिश करें (init या upstart के माध्यम से) और यह pidfile की जांच करेगा, और या तो इसे शुरू करें या यदि यह पहले से ही चल रहा है तो इसे रद्द कर दें। यह अभी भी 100% विश्वसनीय नहीं है, लेकिन यह उतना ही करीब है जितना आपको मिलता है।
देखें कि मैं कैसे देख सकता हूं कि क्या मेरा गेम सर्वर अभी भी चल रहा है ... अन्य समाधानों के लिए।
इस स्थिति में, लॉकफ़ाइल या लॉकडिर का उपयोग करें। उदाहरण के लिए
#!/usr/bin/env bash
if ! mkdir /tmp/abc.lock; then
printf "Failed to acquire lock.\n" >&2
exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT # remove the lockdir on exit
# rest of script ...
लॉकिंग के अन्य तरीकों के लिए बैश FAQ 45 देखें ।
pgrep
या ps
पूरी तरह से पर्याप्त है और अपने दृष्टिकोण overkill की तरह लगता है। यदि आप सार्वजनिक वितरण के लिए एक अंक लिख रहे हैं, हालांकि, आपको इसे सबसे सुरक्षित तरीके से लिखना चाहिए।
rm
कमांड चलाया जाता है। इसलिए जब तक यह जाल सेट होने के बाद समाप्त हो जाता है, तब तक ताला चला जाना चाहिए।
यही है वह जो मेरे द्वारा उपयोग किया जाता है:
#!/bin/bash
#check if abc is running
if pgrep abc >/dev/null 2>&1
then
# abc is running
else
# abc is not running
fi
सादे अंग्रेजी में: यदि 'pgrep' 0 देता है, तो प्रक्रिया चल रही है, अन्यथा यह नहीं है।
संबंधित पढ़ना:
बैश स्क्रिप्टिंग :: स्ट्रिंग तुलना
उबंटू मैनुअल pgrep
pgrep
उसी 15 वर्ण सीमा "फीचर" का पहले उल्लेख किया गया है, इस प्रकार उदाहरण के pgrep gnome-power-manager
लिए भी विफल होगा
-x
विकल्प का उपयोग करते हैं : "केवल मिलान प्रक्रियाएं जिनके नाम (या कमांड लाइन यदि -f निर्दिष्ट है) तो बिल्कुल पैटर्न से मेल खाते हैं।"
pidof -x $(basename $0)
अगर यह पहले से ही चल रहा है, तो मैं आमतौर पर अपनी स्क्रिप्ट पर जांच कर सकता हूं।
@ Rommel-cid के आइडिया पर रीफिंग, आप के pidof
साथ उपयोग कर सकते हैं || (||) एक कमांड को चलाने के लिए यदि प्रक्रिया मौजूद नहीं है और प्रक्रिया को मौजूद करने के लिए && कुछ चल रहा है, तो इस प्रकार एक त्वरित अगर / तो / सशर्त का निर्माण होगा। उदाहरण के लिए यहां चल रही प्रक्रिया (मेरा क्रोम ब्राउज़र, जिसका प्रक्रिया नाम "क्रोम" है) और एक प्रक्रिया जो मौजूद नहीं है के लिए एक परीक्षण है। मैंने 1> / dev / null का उपयोग करते हुए मानक आउटपुट को दबा दिया ताकि वह प्रिंट न हो:
$ (pidof chrome 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run instea\
d"
its running? ok, so am i then
$ (pidof nosuchprocess 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run\
instead"
it's not running? ok i'll run instead
$
"सरल" समाधानों में से कोई भी मेरे लिए काम नहीं करता है क्योंकि मुझे जिस बाइनरी की जांच करने की आवश्यकता है वह सिस्टम-वाइड स्थापित नहीं है, इसलिए मुझे पथ के साथ जांचना होगा, जिसके लिए ps -ef | grep
दृष्टिकोण का उपयोग करना आवश्यक है :
app="$_sdir/Logic 1.2.18 (64-bit)/Logic"
app_pid=`ps -ef | grep "$app" | awk '{print $2}'`
if `ps -p $app_pid > /dev/null`; then
echo "An instance of logic analyzer is appear to be running."
echo "Not starting another instance."
exit 5
else
nohup "$app" &> /dev/null &
fi
पहली बात जो आपकी समस्या के लिए मेरे दिमाग में आई थी:
ps aux | grep -i abc
अगर इसकी चल रही है तो प्रक्रिया का विवरण दिखाएगा। आप लाइनों की संख्या या समय से मेल खा सकते हैं, जिसके लिए यह चल रहा है और शून्य या किसी भी अन्य हेरफेर के साथ तुलना कर सकता है। जब आप उपरोक्त कमांड चलाते हैं, तो यह आपको आउटपुट की एक पंक्ति दिखाएगा अर्थात थिए grep कमांड द्वारा बनाई गई प्रक्रिया के बारे में विस्तार से बताएगा।
यह एक साधारण हैक के रूप में करना चाहिए। इसे बैश स्क्रिप्ट में डालें और देखें कि क्या यह मददगार है।
का उपयोग कर start-stop-daemon
:
/sbin/start-stop-daemon --background --make-pidfile --pidfile /tmp/foo.pid -S --startas /usr/bin/program -- arg1 arg2
यह सामान्य उपयोगकर्ता की तरह काम करता है।
मैंने पाया कि @Jrr Vrbanac द्वारा पोस्ट किए गए स्वीकृत उत्तर ने मेरे लिए काम नहीं किया है, और @geirha द्वारा पोस्ट किया गया उत्तर मूल प्रश्न का उत्तर नहीं देता है।
एक PHP प्रक्रिया मेरे लिए चल रही थी या नहीं, मैं CentOS 7 चला रहा हूँ, यह जाँचने के लिए जॉन व्राबनैक के समाधान ने काम नहीं किया।
@ जिरिहा का जवाब केवल यह सुनिश्चित करता है कि एक उदाहरण दूसरे को शुरू करने से पहले नहीं चल रहा है। यह मूल प्रश्न नहीं था, मूल प्रश्न यह जांचने के लिए था कि कोई प्रक्रिया चल रही है या नहीं।
यहाँ मेरे लिए क्या काम किया गया है:
कहो मेरी प्रक्रिया में स्ट्रिंग "जेन" था यह प्रक्रिया नाम है। यह पता चलेगा कि यह चल रहा है या नहीं। यह BASH और PHP स्क्रिप्ट के लिए काम करता है।
ps -aux | grep "[J]ane" > /dev/null 2>&1
if [[ "$?" == "0" ]]; then
echo "It's running"
else
echo "It's not running"
fi
## bash
## function to check if a process is alive and running:
_isRunning() {
ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}
## example 1: checking if "gedit" is running
if _isRunning gedit; then
echo "gedit is running"
else
echo "gedit is not running"
fi
## example 2: start lxpanel if it is not there
if ! _isRunning lxpanel; then
lxpanel &
fi
## or
_isRunning lxpanel || (lxpanel &)
नोट : pgrep -x lxpanel
या pidof lxpanel
अभी भी रिपोर्ट है कि lxpanel
यह तब भी चल रहा है जब यह ख़राब (ज़ोंबी) है; तो जीवित और चल रही प्रक्रिया को प्राप्त करने के लिए, हमें उपयोग करने की आवश्यकता है ps
औरgrep
23 सितंबर 2016 तक, pgrep को काम करने के लिए muru की स्क्रिप्ट के लिए "-x" विकल्प की आवश्यकता प्रतीत होती है।
#!/bin/bash
if pgrep -x "conky" > /dev/null 2>&1
then
echo "conky running already"
else
echo "now starting conky"
conky
fi
exit 0
मैंने उबंटू 16.04.1 मशीन पर उपरोक्त स्क्रिप्ट की कोशिश की और परीक्षण किया। का आनंद लें!
#!/bin/bash
while [ true ]; do # Endless loop.
pid=`pgrep -x ${1}` # Get a pid.
if [ -z $pid ]; then # If there is none,
${1} & # Start Param to background.
else
sleep 60 # Else wait.
fi
done
zombie
प्रक्रिया ('मैं एक "चल रही" प्रक्रिया के रूप में क्या वर्णन करता हूं)। क्या की पूरी सूचीSTAT
स्तंभ मान, के उत्पादन मेंps
, इंगित करता है यहां इच्छुक उन एक जवाब है कि इस के लिए उपयुक्त है लिखते हैं, या अपने स्वयं संपादित करने के लिए के लिए।