बैश स्क्रिप्ट से मैन्युअल रूप से एक पीआईडी ​​फ़ाइल लिखें


10

मैं एक बैश-स्क्रिप्ट कैसे लिख सकता हूं जो एक लंबे चलने वाले प्रोग्राम को चलाता है और प्रोग्राम प्रोसेस आईडी को एक अलग फाइल में स्टोर करता है?

मुझे कुछ चाहिए

#!/bin/bash
exec long_running_tool
echo `ps af |grep "long_running_tool" |awk '$5 == "long_running_tool" {print $1}'` > pid_file

हालाँकि ऐसा करने के psबाद उपकरण समाप्त हो जाएगा।

क्या प्रक्रिया बनाने की प्रक्रिया आईडी प्राप्त करने का कोई तरीका है?


2
आपका नमूना कोड काम नहीं करेगा क्योंकि निष्पादन कांटा नहीं करता है, इसलिए शेल प्रक्रिया को प्रक्रिया द्वारा बदल दिया जाता long_running_toolहै। नतीजतन, निष्पादन कभी नहीं लौटता है और निम्नलिखित पंक्ति कभी नहीं पहुंचती है। देखें help exec, execve(2)
एटिने डेकाम्प्स 10

@ e-t172 इशारा करने के लिए धन्यवाद। मैं तब 'अमल' को हटाता हूं।
डर्माईक

जवाबों:


12

आप "और" के साथ पृष्ठभूमि में प्रक्रिया को आसानी से चला सकते हैं, फिर "$!" का उपयोग करके पृष्ठभूमि प्रक्रिया का पीआईडी ​​प्राप्त करें।

#!/bin/bash
long_running_tool &
echo $! > pid_file

फिर, वैकल्पिक रूप से, $ रुको! यदि आप चाहते हैं कि प्रक्रिया को पूरा करने तक शेल ब्लॉक हो जाए।


1
अद्यतन: जब मैं fg का उपयोग करता हूं तो मुझे 'fg: 21: job (शून्य) जॉब कंट्रोल के तहत नहीं बनाया जाता है' और स्क्रिप्ट ब्लॉक नहीं होती है। माफ़ करना।
डर्माईक

"रुको $!" एफजी के समान प्रभाव होना चाहिए कि मैं वास्तव में एक स्क्रिप्ट में काम कर सकता हूं। मुझे शायद पोस्ट करने से पहले जाँच करनी चाहिए थी। >>> मेरा बुरा।
जेरेमी स्तुतिवंत

9
#!/bin/bash
echo $$ > fooapp.pid
exec fooapp

जैसा कि पहले उल्लेख किया गया है, पीआईडी ​​को बरकरार रखते हुए , निर्दिष्ट कार्यक्रम के साथ exec बदलता हैbash

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