शेल स्क्रिप्ट में अंतिम निष्पादित कमांड की पाइड कैसे प्राप्त करें?


254

मैं इस तरह से एक शेल स्क्रिप्ट लेना चाहता हूं:

my-app &
echo $my-app-pid

लेकिन मुझे नहीं पता कि कैसे सिर्फ निष्पादित कमांड का पिड मिलता है।

मुझे पता है कि मैं बस jobs -p my-appकमांड का उपयोग pid को grep करने के लिए कर सकता हूं । लेकिन अगर मैं कई बार शेल को निष्पादित करना चाहता हूं, तो यह विधि काम नहीं करेगी। क्योंकि जॉबस्पेक अस्पष्ट है।

जवाबों:


338

अंतिम निष्पादित कमांड का PID $!शेल चर में है:

my-app &
echo $!

1
यह उदाहरण के लिए मुद्रण pid है। [१]] ९। मुझे केवल नंबर चाहिए।
— user3153014

33
यह ध्यान दिया जाना चाहिए कि यह पृष्ठभूमि में शुरू किए गए कार्यक्रमों के लिए है । यदि कोई पृष्ठभूमि प्रक्रिया शुरू नहीं की गई है तो पैरामीटर सेट नहीं है।
— रामरनर 21

5
एक और योग्य समाधान का सुझाव दिया गया है (एक उत्तर के लिए एक टिप्पणी) कि कैसे बस शुरू की प्रक्रिया से छुटकारा पाएं: ओह, और "ऑनलाइनर": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- 14:28 पर sysfault नवंबर 24 '10
— imz - इवान ज़खरायास्वाव

14
@ user3153014 स्ट्रिंग की तरह "[2] 2625" पृष्ठभूमि कार्य शुरू करने के बाद शेल द्वारा मुद्रित किया जाता है। यह उत्पादन से संबंधित नहीं हैecho $!
— पेट्र ग्लैडिख

मैं आमतौर पर एक स्क्रिप्ट में ऐसे कोड का उपयोग करता हूं जब मुझे प्रक्रिया समाप्त होने तक इंतजार करना पड़ता है। my-app & myVar=$! ; fg। fgफिर से अग्रभूमि की प्रक्रिया लाता है। मैं बाद में प्रिंट कर सकता हूं echo $myVarऔर मुझे पूरा यकीन है कि मेरा ऐप पहले ही समाप्त हो चुका है।
— व्रत ब्लेज़ेक

66

प्राप्त करें PID:

#!/bin/bash
my-app &
echo $!

PIDचर में सहेजें :

#!/bin/bash
my-app &
export APP_PID=$!

PIDपाठ फ़ाइल में सभी उदाहरण सहेजें :

#!/bin/bash
my-app &
echo $! >>/tmp/my-app.pid

आउटपुट, त्रुटियों और PIDअलग फ़ाइलों में सहेजें :

#!/bin/bash
my-app >/tmp/my-app.log 2>/tmp/my-app.error.log &
echo $! >>/tmp/my-app.pid

echo "my-app PID's: $(cat /tmp/my-app.pid)"

3
यह सवाल पुनर्निर्देशन के बारे में नहीं पूछा गया था, तो आपका उत्तर ज्यादातर स्वीकार किए गए के समान है, सिवाय इसके कि यदि कोई my-appफिनिश खत्म हो जाए, और शायद इससे भी बदतर इसका पीआईडी ​​बाद में पुन: उपयोग हो जाता है, तो आपकी फाइल में जानकारी खराब होगी। मुझे नहीं लगता कि यह उत्तर वास्तव में मौजूदा स्वीकार किए गए उत्तर के मूल्य को ज्यादा जोड़ता है
— एरिक रेनॉफ

@EricRenouf पोस्ट अपडेट की गई!
— एडुआर्डो क्यूमो

एक और व्युत्पन्न जो उपयोगी हो सकता है। यह पीआईडी ​​प्राप्त करता है और एक ही समय में इसे (ज्यादातर) अग्रभूमि प्रक्रिया के रूप में मानता है: sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?`
— मलाथे

isnt APP = main &पीआईडी ​​हड़पने का एक तरीका?
— MrMesees

3

कुछ ऐसा आजमाएं

pidof my_app >> /tmp/my_app.pid

1
बाहरी कमांड, और धीमी गति से, अगर सिस्टम सीधे पीआईडी ​​दे सकता है तो सभी प्रक्रियाओं के माध्यम से खोज करने के लिए बस क्यों? और यह भी, निश्चित नहीं है कि आपको सही मूल्य मिलेगा
— पापो

-4

कुछ इस तरह की कोशिश करो:

 ps ef | grep "[m]y-app" | awk '{print $2}'

अपनी प्रक्रिया के पहले अक्षर को बीच में रखना [ ]सुनिश्चित करता है कि आपको grepअपनी सूची में प्रक्रिया नहीं मिली है । यदि आवश्यक हो तो आप अपने उपयोगकर्ता नाम पर एक grep भी जोड़ सकते हैं।


9
यह सबसे अच्छा नाजुक है और काम नहीं करता है अगर my-appएक से अधिक बार निष्पादित किया जाता है - davidshen84 विशेष रूप से उस कैस के बारे में चिंता करता है।
— Mat

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