यदि पीआईडी ​​चल रहा है तो जाँच का उचित तरीका क्या है?


12

मेरे पास एक .pidफ़ाइल है, और मुझे यह देखने की ज़रूरत है कि क्या प्रक्रिया चल रही है। अब तक मुझे दो विकल्प मिले

kill -0 `cat something.pid`

अगर एक त्रुटि प्रिंट करता है अगर pid नहीं चल रहा है। मुझे पता है कि इसे पुनर्निर्देशित किया जा सकता है /dev/null, लेकिन यह मुझे लगता है कि यह सबसे अच्छा समाधान नहीं है।

दूसरा उपाय उपयोग करना होगा ps, जो कि हालांकि STDOUT पर प्रिंट करता है

ps -ef `cat something.pid`

क्या आउटपुट को रीडायरेक्ट करना सामान्य है /dev/nullऔर लौटे हुए स्टेटस कोड का उपयोग करना है या यह संकेत है कि मैं कुछ गलत कर रहा हूं और मुझे अलग कमांड की आवश्यकता है?


5
kill -0मानक (POSIX) -compliant के रूप में उपयोग करें ।
एंडर्स

संबं
धत ल ं क

जवाबों:


10

अधिकांश linux distros के लिए / proc / {pid} को चलाने के लिए चल रही प्रक्रियाओं के बारे में जानकारी प्राप्त करने का एक अच्छा तरीका है, और आमतौर पर कैसे "ps" जैसे उपयोक्ता कमांड कर्नेल के साथ संचार कर रहे हैं। तो उदाहरण के लिए आप कर सकते हैं;

[ -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

संपादित करें: आपको जांचना चाहिए कि kpid सेट है, लेकिन यह अधिक उपयोगी है क्योंकि यह "$" के लिए "मौजूद नहीं" होगा।

[ -n "${kpid}" -a -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

@SteveMuster यह उत्तर को लिनक्स-विशिष्ट बना देगा। OSX पर कोई / खरीद नहीं है। और मुझे लगता है कि बीएसडी पर कोई खरीद नहीं है।
राख

इस बात पर ध्यान दें कि आपको यह सुनिश्चित करने की आवश्यकता ${kpid}है
विल्फ़

@Wilf मैंने इसे संपादित किया है, इसलिए यह "$ $ kpid" के लिए "प्रक्रिया मौजूद नहीं है"
टॉम एच

धन्यवाद - मैं एक स्क्रिप्ट कर रहा था जो एक समान विधि का उपयोग करके एक पीआईडी ​​की जांच करता है और जब तक मुझे यह पता नहीं चला, तब तक यह काम नहीं किया :)
विल्फ

6

जैसा कि एंडर्स ने कहा, आपको kill -0POSIX अनुपालन के लिए उपयोग करना चाहिए ।

लिनक्स सिस्टम पर, आप / proc फाइलसिस्टम में फ़ाइल के अस्तित्व की जांच कर सकते हैं, उदाहरण के लिए,

-f /proc/$(cat something.pid)/status

1

यदि यह एक स्क्रिप्ट में है (जो मुझे लगता है कि जैसा कि आप stdout में मुद्रण के बारे में चिंतित हैं) तो निम्नलिखित होगा कि आप इसे कैसे कर सकते हैं:

if ps -p $(cat something.pid) > /dev/null 2>&1
then
    kill $(cat something.pid)
else
    # Deal with the fact that the process isn't running
    # i.e. clear up the pid file
fi

ps -pपीआईडी something.pid में निर्दिष्ट के साथ एक प्रक्रिया के लिए दिखता है ( $()वाक्य रचना बैकटिक की एक थोड़ा नया संस्करण है। Backtick कुछ निश्चित परिस्थितियों जो नया रूप नहीं है में से बचने की जरूरत है)। 2>&1रीडायरेक्ट के साथ-साथ उस आदेश के लिए stderr।

यदि ps -pआदेश उस PID के साथ प्रक्रिया नहीं ढूँढता है, तो यह एक त्रुटि> 0 के साथ बाहर निकलता है और इसलिए elseनिष्पादित हो जाता है। नहीं तो killबयान। यदि आप ऐसा करके उपरोक्त को नकार सकते हैं:

if ! ps -p ...

उम्मीद है कि यह आपके सवाल का जवाब देता है। स्पष्ट रूप से सावधान रहें और खतरनाक कमांड का उपयोग करते समय बहुत परीक्षण करें जैसे कि kill


1

यहाँ कुछ विकल्प दिए गए हैं:

  • यदि आप init- स्क्रिप्ट लिख रहे हैं (उदाहरण के लिए एक जगह /etc/init.d/) और यदि आप डेबियन-आधारित डिस्ट्रो का उपयोग कर रहे हैं, तो आप बेहतर उपयोग करेंगे start-stop-daemon:
    # start-stop-daemon -T -p $PIDFILE -u $USER_NAME -n $NAME
    यदि यह चल रहा है तो आपको बाहर निकलें कोड 0 प्राप्त करना चाहिए।
  • आप procpsपैकेज से pgrep और pkill का उपयोग कर सकते हैं :
    pgrep --pidfile $PIDFILE

0

यदि आपके पास pid फ़ाइल है, तो आप pgrep का उपयोग करके जाँच सकते हैं कि क्या प्रक्रिया चल रही है:

    if pgrep -F something.pid; then
        echo "Running"
    else
        echo "Not running"
    fi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.