$ पीआईडी ​​दिए गए प्रक्रिया से बाहर निकलने के लिए सुनो


16

कहो मेरे पास एक हाथ है, mypid=$$

क्या कुछ bash / system कमांड है जिसका उपयोग मैं दिए गए pid के साथ उस प्रक्रिया से बाहर निकलने के लिए सुन सकता हूँ?

यदि mypid के साथ कोई प्रक्रिया मौजूद नहीं है, तो मुझे लगता है कि कमांड को बस विफल होना चाहिए।


मैं C # का उपयोग नहीं करता हूं, लेकिन जाहिर तौर पर इसका एक तरीका होना चाहिए: msdn.microsoft.com/en-us/library/fb4aw7b8(v=vs.110).aspx
अलेक्जेंडर मिल्स

यूनिक्स में, शेल या सी लाइब्रेरी फ़ंक्शन का उपयोग करके बाल प्रक्रियाओं की प्रतीक्षा करना आम है । गैर-चाइल्ड प्रक्रिया की प्रतीक्षा करने का कोई मानक तरीका AFAIK नहीं है। यह अधिक स्पष्ट नहीं है कि यदि C # फ़ंक्शन ऐसा कर सकता है (यह निर्भर करता है कि "संबद्ध प्रक्रिया" क्या है)। waitwait()
Kusalananda

मैं मतदान के साथ ऐसा कर सकता था, लेकिन यह भयानक होगा
अलेक्जेंडर मिल्स

यह संभवतः आपको गलत परिणाम भी देगा। पीआईडी ​​पुन: उपयोग का सैद्धांतिक रूप से मतलब हो सकता है कि एक प्रक्रिया उसी पीआईडी ​​के साथ जीवित हो सकती है जिस प्रक्रिया का आप इंतजार कर रहे हैं। लिनक्स पर (अनुक्रमिक पीआईडी ​​के साथ) यह संभावना नहीं होगी , लेकिन ओपनबीएसडी (यादृच्छिक पीआईडी ​​आवंटन) जैसी प्रणालियों पर, यह एक मुद्दा होगा।
Kusalananda

जवाबों:


21

मुझे इस उत्तर से क्या चाहिए: https://stackoverflow.com/a/41613532/1223975

..टर्न का उपयोग wait <pid> केवल तभी काम करेगा जब वह पीआईडी ​​वर्तमान प्रक्रिया का एक बच्चा प्रक्रिया हो

हालांकि निम्नलिखित किसी भी प्रक्रिया के लिए काम करेंगे:

किसी प्रक्रिया के समाप्त होने की प्रतीक्षा करने के लिए

लिनक्स:

tail --pid=$pid -f /dev/null

डार्विन (जिनके $pidपास खुली फाइलें हैं):

lsof -p $pid +r 1 &>/dev/null

टाइमआउट (सेकंड) के साथ

लिनक्स:

timeout $timeout tail --pid=$pid -f /dev/null

डार्विन (जिनके $pidपास खुली फाइलें हैं):

lsof -p $pid +r 1m%s -t | grep -qm1 $(date -v+${timeout}S +%s 2>/dev/null || echo INF)

यह लिनक्स से संबंधित नहीं है, यह GNU टेल की एक विशेषता है। इसलिए यह GNU / Linux वाले GNU टेल के साथ किसी भी सिस्टम पर काम करेगा, और यह नॉन-GNU लिनक्स-आधारित सिस्टम पर काम नहीं करेगा।
स्टीफन चेज़लस

मुझे डर है कि पूंछ / lsof इस मामले में मतदान का उपयोग करेगी, कम से कम अनुभवजन्य साक्ष्य यह देखते हुए कि यह MacOS पर इस तरह से दिखाई देता है।
अलेक्जेंडर मिल्स

lsof + r इसे रिपीट मोड में डालता है, इसलिए यह कमांड हर सेकंड को दोहरा रहा है, इसलिए यह मतदान का उपयोग कर रहा है, लानत है
अलेक्जेंडर मिल्स

3

आप बैश बिलिन का उपयोग कर सकते हैं wait:

$ sleep 10 &
[2] 28751
$ wait 28751
[2]-  Done                    sleep 10
$ help wait
wait: wait [-n] [id ...]
    Wait for job completion and return exit status.

    Waits for each process identified by an ID, which may be a process ID or a
    job specification, and reports its termination status.  If ID is not
    given, waits for all currently active child processes, and the return
    status is zero.  If ID is a a job specification, waits for all processes
    in that job's pipeline.

    If the -n option is supplied, waits for the next job to terminate and
    returns its exit status.

    Exit Status:
    Returns the status of the last ID; fails if ID is invalid or an invalid
    option is given.

यह सिस्टम कॉल का उपयोग करता है waitpid()..

$ whatis waitpid
waitpid (2)          - wait for process to change state

अच्छा है कि मेरे लिए काम करता है, उम्मीद है कि हुड के तहत मतदान का उपयोग नहीं करता है, धन्यवाद!
अलेक्जेंडर मिल्स

1
हाँ मेरे उपयोग के मामले के लिए काम नहीं करेगा, मुझे यह त्रुटि मिलती है: bash: wait: pid 47760 is not a child of this shell... आरेखण बोर्ड में वापस लौटें
अलेक्जेंडर मिल्स

मेरे पास जवाब है, मैंने अभी इसे thx
अलेक्जेंडर मिल्स

2
यह केवल बाल प्रक्रियाओं की प्रतीक्षा करेगा, वर्तमान प्रक्रिया से अलग नहीं की गई प्रक्रिया के लिए।
Kusalananda

1

Https://stackoverflow.com/a/41613532/1223975 सॉल्यूशन के बारे में कि अलेक्जेंडर मिल्स ने रिपॉजिट किया, Timeout in Seconds Darwinएक UNIX जैसे OS के लिए एक वर्कअराउंड है जिसमें GNU नहीं है tail। यह Darwinयूनिक्स-जैसे ऑपरेटिंग सिस्टम की उम्र के आधार पर विशिष्ट नहीं है , लेकिन पेश की जाने वाली कमांड-लाइन आवश्यकता से अधिक जटिल है, और विफल हो सकती है:

lsof -p $pid +r 1m%s -t | grep -qm1 $(date -v+${timeout}S +%s 2>/dev/null || echo INF)

कम से कम एक पुराने यूनिक्स पर, lsofतर्क +r 1m%sविफल हो जाता है (यहां तक ​​कि एक सुपरयुजर के लिए):

lsof: can't read kernel name list.

m%sएक निर्गम प्रारूप विनिर्देश है। एक सरल पोस्ट-प्रोसेसर को इसकी आवश्यकता नहीं है। उदाहरण के लिए, निम्नलिखित कमांड पांच सेकंड के लिए PID 5959 पर इंतजार करती है:

lsof -p 5959 +r 1 | awk '/^=/ { if (T++ >= 5) { exit 1 } }'

इस उदाहरण में, यदि पीआईडी ​​5959 पांच सेकंड के एलैपेस से पहले अपने स्वयं के समझौते से बाहर निकलता है, ${?}है 0। अगर पांच सेकंड के बाद नहीं ${?}लौटे 1

यह भी स्पष्ट रूप से ध्यान देने योग्य हो सकता है कि +r 1, 1चुनाव अंतराल (सेकंड में) है, इसलिए इसे स्थिति के अनुरूप बदला जा सकता है।

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