प्रक्रिया की जांच कैसे करें पहले से ही चल रहा है या नहीं


32

मैं पहले से चल रहे या नहीं विशेष प्रक्रिया की जांच करना चाहता हूं।

मैंने इस प्रश्नोत्तर को रेफरी किया ।

लेकिन मुझे कोई विशेष समाधान नहीं मिला। निम्नलिखित उदाहरण है कि मैंने कोशिश की: मैंने abc.shफ़ाइल बनाई है और इस स्क्रिप्ट को पृष्ठभूमि पर चलाया है, जैसे sh abc.sh &

अब यह फाइल बैकग्राउंड पर चल रही है और मैं ps aux | grep "abc"कमांड को फायर करता हूं ।

निम्नलिखित इस आदेश का उत्पादन है:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

उसके बाद मैं abc.shरनिंग स्क्रिप्ट को रोकता हूं और उसी कमांड ps aux | grep "abc"कमांड को फायर करता हूं ।

लेकिन मुझे वही आउटपुट मिल रहा है जैसे:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

क्या प्रक्रिया खोजने का कोई अन्य तरीका है या नहीं?

जवाबों:


41

के उत्पादन में हर प्रक्रिया सूचीबद्ध होगी ps aux; चाहे दौड़ना, सोना, ज़ोंबी या रुकना।

हालाँकि, आपके मामले में, चूंकि आपने प्रक्रिया का उपयोग करके भाग लिया है sh abc.sh, shयह एप्लिकेशन (शेल) है जो चल रहा है और नहीं abc.sh। इसलिए, ps auxइसमें वह प्रक्रिया शामिल नहीं होगी abc.shजिसके कारण grepकोई परिणाम नहीं निकल सका।

तो, सही तरीका है कि आप इसे इस्तेमाल किया जाना चाहिए है:

ps aux | grep sh

यह आपको अन्य प्रक्रिया को भी लौटा सकता है shजो उनके आउटपुट में कहीं भी स्ट्रिंग कर रहे हैं ps aux

आप ध्यान देना चाहिए कि प्रक्रिया जाएगा "चल" हो जब के उत्पादन में ps auxअपनी है STATके रूप में R। यदि यह इसके अलावा कुछ और है, तो यह उस समय नहीं चल रहा है जब आपने चल रही प्रक्रियाओं की जांच करने के लिए कमांड को निकाल दिया था। पीएस के लिए अलग-अलग प्रक्रिया राज्यों को मैन पेज में पाया जा सकता है:

D    uninterruptible sleep (usually IO)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped, either by a job control signal or because it is being traced
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent

आप यह topजांचने के लिए कमांड को चला सकते हैं कि क्या प्रक्रिया चल रही है या सो रही है और सीपीयू, रैम की कितनी मात्रा है। (यह फिर से आपकी प्रक्रिया को सूचीबद्ध करेगा sh)।

हालाँकि, यदि आप चाहते हैं कि आपकी प्रक्रिया को सूचीबद्ध किया जाए abc.sh, तो आपके पास उस स्क्रिप्ट की पहली पंक्ति होनी चाहिए जिस पर आप चल रहे हैं:

#!/bin/sh

ताकि शेल को पता चले कि स्क्रिप्ट को चलाने के लिए किस एप्लिकेशन का उपयोग करना है (इस मामले में श के लिए, इसे #!/bin/bashबैश के लिए बदलें ) और फिर उपयोग करने वाली प्रक्रिया को निष्पादन योग्य अनुमति प्रदान करें:

chmod +x /path/to/abc.sh

फ़ाइल /path/to/के स्थान के साथ प्रतिस्थापित करना abc.shऔर फिर abc.shउपयोग करके चलाना

/path/to/abc.sh

फ़ाइल /path/to/के स्थान के साथ फिर से बदल रहा है abc.sh


2
एक त्वरित प्रश्न। मूर्ति का S+अर्थ क्या है
प्रकाश वी। होल्कर

लेकिन आप ps aux | grep filenameकमांड के आउटपुट के माध्यम से चल रही प्रक्रियाओं और नहीं चलने वाली प्रक्रियाओं के बीच अंतर पा सकते हैं ।
अविनाश राज

@TechGuru: इसका मतलब है कि प्रक्रिया अग्रभूमि में सो रही है, पीएस के मैनुअल पेज को अधिक के लिए देखें।
जॉबिन

@AvinashRaj: हाँ, बेशक आप कर सकते हैं।
जॉबिन

मुझे एक त्रुटि मिलती है: त्रुटि, यह करें: माउंट -t proc खरीद / खरीद
IgorGanapolsky

7

के साथ मेरी समस्या grepयह है कि यह एक पूरी लाइन पार्सर है। आपके उदाहरण में, आप "एबीसी" की खोज कर रहे हैं लेकिन यह grep("एबीसी" की तलाश में है) के उदाहरण को वापस खींच रहा है । थोड़ा गोलाकार। आप इसे फ़िल्टर कर सकते हैं लेकिन मुझे लगता है कि थोड़ा विकृत है।

मैं awkएक छोटे से पैनकेक के लिए मुड़ता हूं ।

ps aux | awk '$12=="abc.sh"'

awkव्हाट्सएप (डिफ़ॉल्ट रूप से) के आधार पर लाइनों को खेतों में विभाजित करता है। फ़ील्ड $ 11 + कमांड कॉलम (s) हैं, इसलिए यदि कमांड "sh abc.sh ..." है, तो $11होगा shऔर $12होगा abc.sh

यदि आप बैश के ऑपरेटरों &&और ||ऑपरेटरों के साथ आउटपुट या चेन को नियंत्रित करना चाहते हैं , तो आप कर सकते हैं, लेकिन आपको थोड़ा और चतुर होने की आवश्यकता होगी। grepस्थिति कोड 1 (तकनीकी विफल, ट्रिगर ||) के साथ बाहर निकल जाएगा अगर कुछ भी नहीं मिला है, लेकिन awkहमेशा कोड से बाहर निकल जाएगा 0. हम इसे बाहर निकलने के लिए कहकर बदल सकते हैं यदि यह कुछ पाता है और 1 को फेंक देता है यदि यह नहीं होता है:

ps aux | awk '$12=="abc.sh" {exit 0} END{exit 1}' && echo running || echo not running

बेशक अगर आप स्क्रीन पर आउटपुट लिखने की परवाह करते हैं, तो आप यह सब कर सकते हैं awk:

ps aux | awk '$12=="abc.sh" {print "running"; exit} END{print "not running"}'

4

वर्तमान बैश सत्र में जांच करने का सही तरीका अगर पृष्ठभूमि में एक प्रक्रिया शुरू हुई, जैसे sh abc.sh &, पहले से ही चल रही है या नहीं, jobsबिलिन कमांड का उपयोग करना है ।

उदाहरण:

$ sh abc.sh &
[1] 6917
$ jobs
[1]+  Running                 sh abc.sh &

इसका मतलब है कि sh abc.shपृष्ठभूमि में शुरू की गई प्रक्रिया चल रही है। यदि प्रक्रिया समाप्त हो गई है तो आपको कुछ इस तरह दिखाई देगा:

[1]+  Done                    sh abc.sh

यदि आपके पास पृष्ठभूमि में चलने वाली अधिक प्रक्रियाएं हैं, तो आप आउटपुट को केवल sh abc.shउपयोग की प्रक्रिया तक सीमित कर सकते हैं :

jobs sh

help jobsअधिक जानकारी के लिए देखें ।

उपरोक्त विधि केवल बैश के वर्तमान सत्र में काम करेगी। लेकिन अगर आप दूसरे बैश सत्र में हैं (उदाहरण के लिए एक और टर्मिनल विंडो या टैब में, या एक स्क्रिप्ट में), एक तरफ से:

ps aux | grep "[s]h bin/test.sh"

आप यह भी उपयोग कर सकते हैं:

pgrep -a sh

जो मुझे अधिक सरल लगता है। यदि आप आउटपुट में ( sh abc.shइस मामले में) अपनी टाइप की गई कमांड देखेंगे , तो इसका मतलब है कि प्रक्रिया अभी भी चल रही है। यदि नहीं, तो प्रक्रिया समाप्त हो गई है।


3

यदि आपकी स्क्रिप्ट वर्तमान में चल रही है, तो उसे ps auxकमांड द्वारा दिखाया जाना चाहिए । यदि यह नहीं दिखाया गया है ps, तो हो सकता है कि आपकी स्क्रिप्ट का निष्पादन वर्तमान में समाप्त हो जाए।

psइस तरह का आउटपुट का मतलब है कि आपकी स्क्रिप्ट वर्तमान में नहीं चल रही है,

$ ps aux | grep hm.sh
avinash   6386  0.0  0.0  15940   932 pts/16   S+   17:34   0:00 grep --color=auto hm.sh

यदि यह ऐसा दिखाता है, जिसका अर्थ है कि आपकी स्क्रिप्ट वर्तमान में चल रही है।

$ ps aux | grep hm.sh
avinash   6454  0.0  0.0  16616  1384 pts/16   S+   17:35   0:00 /bin/bash ./hm.sh
avinash   6535  0.0  0.0  15940   932 pts/27   R+   17:35   0:00 grep --color=auto hm.sh

यह सब स्क्रिप्ट की सामग्री पर आधारित है।

उदाहरण के लिए, यदि आप इस तरह से एक स्क्रिप्ट बनाते हैं। यह निष्पादन पर संदेश HI को प्रदर्शित करता है। आउटपुट प्रदर्शित करने में कुछ सेकंड लगते हैं और अंतिम परिणाम आने के बाद इसे समाप्त कर दिया जाता है।

#!/bin/bash
echo "HI"

लेकिन अगर आपकी स्क्रिप्ट इस तरह है,

#!/bin/bash
sudo apt-get update

प्रक्रिया को समाप्त करने में कुछ मिनट लगते हैं। इस बीच यदि आप ps aux | grep filenameकमांड चलाते हैं , तो इसे आउटपुट पर दिखाया जाएगा। क्योंकि फिलहाल स्क्रिप्ट चल रही है।


-2
  • यदि आप सभी प्रक्रियाओं की जाँच करना चाहते हैं तो 'शीर्ष' का उपयोग करें

  • यदि आप जावा द्वारा संचालित प्रक्रियाओं को जानना चाहते हैं तो उपयोग करें ps -ef | grep java

  • यदि अन्य प्रक्रिया है तो बस ps -ef | grep xyzया बस का उपयोग करें/etc/init.d xyz status

  • जैसे किसी भी कोड के माध्यम से करता है, तो .shउसके बाद./xyz.sh status


1
-1 जबकि ये कमांड कुछ परिस्थितियों में उपयोगी हैं, फिर भी वे किसी ऐसे व्यक्ति के लिए बेकार होंगे जो इन परिस्थितियों को नहीं जानता है। प्रत्येक मामले में आप या तो उन्हें पर्याप्त नहीं समझाते या आपका स्पष्टीकरण गलत है।
डेविड फ़ॉस्टर

-2

अगर आप बस यह जांचना चाहते हैं कि कोई प्रक्रिया है या नहीं, तो उस निर्देशिका पर जाएं और ll -trयदि आप फ़ाइल के अंत में देखते हैं .csvया .workआदि टाइप करते हैं तो इसका मतलब है प्रक्रिया के तहत नहीं।


इस जवाब का कोई मतलब नहीं है। एक निर्देशिका की सामग्री को सूचीबद्ध करने से आपको यह नहीं पता चलेगा कि कोई प्रक्रिया चल रही है या नहीं। फ़ाइल एक्सटेंशन .csvअल्पविराम सीमांकित फ़ाइलों के लिए है जो एक चल रही प्रक्रिया से संबंधित नहीं है।
1836 पर user369450
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.