यह कैसे निर्धारित किया जाए कि एक प्रक्रिया चल रही है या नहीं और इसे सशर्त शेल स्क्रिप्ट बनाने के लिए उपयोग करें?


108

मैं यह कैसे निर्धारित कर सकता हूं कि कोई प्रक्रिया चल रही है या नहीं और फिर उस शर्त के आधार पर कुछ सामान को निष्पादित करने के लिए बैश स्क्रिप्ट है?

उदाहरण के लिए:

  • यदि प्रक्रिया abcचल रही है, तो यह करें

  • यदि यह नहीं चल रहा है, तो ऐसा करें।


1
यह नोट करना महत्वपूर्ण है कि नीचे दिए गए समाधानों में से कोई भी प्रक्रिया की स्थिति को ध्यान में नहीं रखता है। मेरे एक प्रश्न पर एक टिप्पणी ने मुझे यहां लाया, लेकिन इस पर एक उत्तर ने मुझे एक कार्यक्रम के विभिन्न राज्य में जोड़ा, जैसे कि zombieप्रक्रिया ('मैं एक "चल रही" प्रक्रिया के रूप में क्या वर्णन करता हूं)। क्या की पूरी सूची STATस्तंभ मान, के उत्पादन में ps, इंगित करता है यहां इच्छुक उन एक जवाब है कि इस के लिए उपयुक्त है लिखते हैं, या अपने स्वयं संपादित करने के लिए के लिए।
user66001

संबंधित चर्चा: unix.stackexchange.com/questions/74185/…
blong

प्रक्रिया की जाँच करने का सबसे अच्छा तरीका मौजूद है: stackoverflow.com/questions/3043978/…
ट्रेवर बॉयड स्मिथ

जवाबों:


166

कुछ ऐसा करने के लिए बैश स्क्रिप्ट कुछ इस तरह दिखाई देगी:

#!/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

@DreadPirateShawn आप मुझे बता सकते हैं कि उपयोग क्यों / देव / अशक्त और न केवल एक 0? संख्या का उपयोग कोड को अधिक पठनीय बनाता है, कम से कम एक noob (जैसे कि मेरे लिए) के रूप में। कोई पुनर्निर्देशित नहीं, कुछ भी नहीं
सिल्विया

2
@ सिल्वु हुह? Googling /dev/null: "/ dev / null कमांड स्टैंडर्ड आउटपुट को null डिवाइस पर रीडायरेक्ट करता है, जो कि एक विशेष डिवाइस है, जो इसे लिखी गई जानकारी को डिस्क्राइब करता है" ... 0कमांड आउटपुट को कमांड आउटपुट पर एक फाइल में रीडायरेक्ट करेगा 0। इस मामले में, मैं सलाह > /dev/nullदूंगा कि आप अधिक आरामदायक बनें - आप इसे हर जगह देखेंगे, क्योंकि यह आउटपुट छोड़ने के लिए मानक / उचित तरीका है।
DreadPirateShawn 5

धन्यवाद धन्यवाद, मैंने एक अच्छी छोटी स्क्रिप्ट के लिए इसका उपयोग किया है जो यह जांचती है कि क्या कोई प्रोग्राम निष्पादित होने से पहले चल रहा है। (हालांकि मुझे इसे थोड़ा विस्तारित करना पड़ा क्योंकि Google क्रोम के निष्पादन योग्य का समान नाम नहीं है क्योंकि यह रन कमांड है, निष्पादन नाम बस क्रोम है।)
सेस्टेरियन

3
कृपया -xपैरामीटर जोड़ें pgrepताकि वह सटीक एप्लिकेशन की तलाश कर रहा है या किसी अन्य ऐप के नाम के अंदर समान स्ट्रिंग पाए जाने पर उसे एक सही सही मिलेगा। मुझे यह पता लगाने में सिर्फ 1 घंटे का समय लगा।
थानोस अपोस्टोलो

1
यह देखने के लिए कि क्या प्रोग्राम उपयोग नहीं चल रहा है! pgrep
मोहम्मद नौरेलिन

36

कोई समाधान जो किसी चीज का उपयोग करता है ps aux | grep abcया pgrep abcत्रुटिपूर्ण है।

क्यों?

क्योंकि आप जाँच नहीं कर रहे हैं कि क्या कोई विशिष्ट प्रक्रिया चल रही है, आप जाँच रहे हैं कि क्या कोई प्रक्रिया चल रही है जो मिलान के लिए होती है abc। कोई भी उपयोगकर्ता आसानी से एक निष्पादन योग्य नाम abc(या जिसमें abcउसका नाम या तर्क कहीं न कहीं शामिल है) बना सकता है और चला सकता है, जिससे आपके परीक्षण के लिए एक गलत सकारात्मक स्थिति पैदा हो सकती है। वहाँ विभिन्न विकल्पों आप आवेदन कर सकते हैं ps, grepऔर pgrepखोज को सीमित करने के लिए, लेकिन आप अभी भी एक विश्वसनीय परीक्षण नहीं मिलेगा।

तो मैं निश्चित रूप से एक निश्चित चलने वाली प्रक्रिया के लिए परीक्षण कैसे करूं?

यह इस बात पर निर्भर करता है कि आपको परीक्षण के लिए क्या चाहिए।

मैं यह सुनिश्चित करना चाहता हूं कि सेवा एबीसी चल रही है, और यदि नहीं, तो इसे शुरू करें

यह क्या init और upstart के लिए है। वे सेवा शुरू करेंगे और यह सुनिश्चित करेंगे कि इसका पिड पीडिफाइल में संग्रहित हो। सेवा को फिर से शुरू करने की कोशिश करें (init या upstart के माध्यम से) और यह pidfile की जांच करेगा, और या तो इसे शुरू करें या यदि यह पहले से ही चल रहा है तो इसे रद्द कर दें। यह अभी भी 100% विश्वसनीय नहीं है, लेकिन यह उतना ही करीब है जितना आपको मिलता है।

देखें कि मैं कैसे देख सकता हूं कि क्या मेरा गेम सर्वर अभी भी चल रहा है ... अन्य समाधानों के लिए।

abc मेरी स्क्रिप्ट है। मुझे यह सुनिश्चित करने की आवश्यकता है कि मेरी स्क्रिप्ट का केवल एक उदाहरण चल रहा है।

इस स्थिति में, लॉकफ़ाइल या लॉकडिर का उपयोग करें। उदाहरण के लिए

#!/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 देखें ।


3
जबकि यह तकनीकी रूप से सच है, मैंने वास्तविक जीवन में इस तरह की समस्या का व्यक्तिगत रूप से सामना किया है। अधिकांश प्रोग्राम स्क्रिप्ट को तोड़ने के तरीकों में अपना नाम नहीं बदलते हैं। इस प्रकार, जैसे सरल स्क्रिप्ट कुछ के लिए pgrepया psपूरी तरह से पर्याप्त है और अपने दृष्टिकोण overkill की तरह लगता है। यदि आप सार्वजनिक वितरण के लिए एक अंक लिख रहे हैं, हालांकि, आपको इसे सबसे सुरक्षित तरीके से लिखना चाहिए।
स्कॉट सेवेंस

2
@ScottSeverance नाम बदलने के कार्यक्रम मुद्दा नहीं है; इसके लिए हस्तक्षेप की आवश्यकता होगी। यह समान प्रोग्राम चलाने वाले अन्य उपयोगकर्ता, या समान नाम वाले अन्य प्रोग्राम हैं जो अचानक स्क्रिप्ट को गलत सकारात्मकता प्रदान करेंगे और इस प्रकार गलत काम करेंगे। मैं सिर्फ "काम करता है" के बजाय "काम" करना पसंद करता हूं।
जिरह

2
मुझे याद आती है। लेकिन हम में से कई सिंगल-यूजर सिस्टम चलाते हैं। और कई उपयोगकर्ता स्थिति में, उपयोगकर्ता नाम के लिए भी आसान है।
स्कॉट सेवेंस

1
क्या होगा यदि आपकी स्क्रिप्ट रनटाइम के दौरान विफल हो जाती है और फ़ाइल को अनलॉक करने से पहले मर जाती है?
jp093121

2
जब स्क्रिप्ट बाहर निकलती है तो @ jp093121 EXIT ट्रैप शुरू हो जाता है। क्या यह बाहर निकलता है क्योंकि यह स्क्रिप्ट के अंत तक पहुंचता है, एक निकास आदेश, या एक संकेत प्राप्त करता है (जिसे संभाला जा सकता है), rmकमांड चलाया जाता है। इसलिए जब तक यह जाल सेट होने के बाद समाप्त हो जाता है, तब तक ताला चला जाना चाहिए।
जिरिहा

18

यही है वह जो मेरे द्वारा उपयोग किया जाता है:

#!/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


thanx! मैं यह भी कोशिश की n यह पूरी तरह से भी काम करता है :)
निर्मिक

pgrepउसी 15 वर्ण सीमा "फीचर" का पहले उल्लेख किया गया है, इस प्रकार उदाहरण के pgrep gnome-power-managerलिए भी विफल होगा
थोरसेन

1
सुनिश्चित करें कि आप pgrep के -xविकल्प का उपयोग करते हैं : "केवल मिलान प्रक्रियाएं जिनके नाम (या कमांड लाइन यदि -f निर्दिष्ट है) तो बिल्कुल पैटर्न से मेल खाते हैं।"
एलेस्टेयर इरविन

5

pidof -x $(basename $0)अगर यह पहले से ही चल रहा है, तो मैं आमतौर पर अपनी स्क्रिप्ट पर जांच कर सकता हूं।


2

@ 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
$

1

"सरल" समाधानों में से कोई भी मेरे लिए काम नहीं करता है क्योंकि मुझे जिस बाइनरी की जांच करने की आवश्यकता है वह सिस्टम-वाइड स्थापित नहीं है, इसलिए मुझे पथ के साथ जांचना होगा, जिसके लिए 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

0

पहली बात जो आपकी समस्या के लिए मेरे दिमाग में आई थी:
ps aux | grep -i abcअगर इसकी चल रही है तो प्रक्रिया का विवरण दिखाएगा। आप लाइनों की संख्या या समय से मेल खा सकते हैं, जिसके लिए यह चल रहा है और शून्य या किसी भी अन्य हेरफेर के साथ तुलना कर सकता है। जब आप उपरोक्त कमांड चलाते हैं, तो यह आपको आउटपुट की एक पंक्ति दिखाएगा अर्थात थिए grep कमांड द्वारा बनाई गई प्रक्रिया के बारे में विस्तार से बताएगा।
यह एक साधारण हैक के रूप में करना चाहिए। इसे बैश स्क्रिप्ट में डालें और देखें कि क्या यह मददगार है।


0

का उपयोग कर start-stop-daemon:

/sbin/start-stop-daemon --background --make-pidfile --pidfile /tmp/foo.pid -S --startas /usr/bin/program -- arg1 arg2

यह सामान्य उपयोगकर्ता की तरह काम करता है।


0

मैंने पाया कि @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

1
आह, यह एक उबंटू क्यू एंड ए साइट है क्योंकि यह आश्चर्य की बात नहीं है कि यहां कुछ जवाब CentOS 7 पर काम नहीं करते हैं क्योंकि लिनक्स यहां विषय से दूर है। लिनक्स के अन्य संस्करण unix.stackexchange.com
एल्डर गीक

हालाँकि उत्तर का लेखक CentOS का उपयोग करता है, फिर भी यह उत्तर ubuntu के लिए मान्य है।
फिलिप -ज्यान के ली- स्टॉकमैन

0
## 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


-1

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 मशीन पर उपरोक्त स्क्रिप्ट की कोशिश की और परीक्षण किया। का आनंद लें!


-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

1
उबंटू पूछने के लिए आपका स्वागत है! मैं सलाह देता हूं कि इस उत्तर को संपादित करें कि यह क्या करता है, इसके बारे में विशिष्ट विवरण के साथ इसका विस्तार करें। (यह भी देखें कि मैं एक अच्छा उत्तर कैसे लिख सकता हूं? सामान्य सलाह के लिए किस तरह के उत्तर आस्कुबंटु पर सबसे अधिक मूल्यवान माने जाते हैं।)
डेविड फ़ॉर्स्टर

-3

isProcessRunning () {अगर [$ (पिडोफ $ 1)> / देव / नल]; फिर प्रतिशोध = 'सत्य'; और रिटवल = 'असत्य'; फाई; इको $ रिटवल; }

isProcessRunning जीनी

सच

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.