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


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=$! ; fgfgफिर से अग्रभूमि की प्रक्रिया लाता है। मैं बाद में प्रिंट कर सकता हूं 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.