python - पिड का उपयोग कर पाइथन से प्रक्रिया को कैसे समाप्त करें?




linux process (2)

मैं अजगर में कुछ छोटी लिपि लिखने की कोशिश कर रहा हूं जो सबप्रोसेस में एक और पायथन कोड शुरू करेगा यदि पहले से ही टर्मिनल और ऐप (लिनक्स) को समाप्त नहीं किया गया है।

तो ऐसा लगता है:

#!/usr/bin/python
from subprocess import Popen

text_file = open(".proc", "rb")
dat = text_file.read()
text_file.close()

def do(dat):

    text_file = open(".proc", "w")
    p = None

    if dat == "x" :

        p = Popen('python StripCore.py', shell=True)
        text_file.write( str( p.pid ) )

    else :
        text_file.write( "x" )

        p = # Assign process by pid / pid from int( dat )
        p.terminate()

    text_file.close()

do( dat )

फ़ाइल ".proc" से कौन सा ऐप पढ़ता है, जो पिड द्वारा प्रोसेस नाम देने के लिए ज्ञान की कमी की समस्या है। दूसरी समस्या यह है कि दुभाषिया कहता है कि नामित स्ट्रिंग "x" के बराबर नहीं है ??? क्या मैंने याद किया है?


भयानक psutil पुस्तकालय का उपयोग करना यह बहुत आसान है:

p = psutil.Process(pid)
p.terminate()  #or p.kill()

यदि आप एक नई पुस्तकालय स्थापित नहीं करना चाहते हैं, तो आप os मॉड्यूल का उपयोग कर सकते हैं:

import os
import signal

os.kill(pid, signal.SIGTERM) #or signal.SIGKILL 

os.kill दस्तावेज भी देखें।

यदि आप python StripCore.py करने में रुचि रखते हैं, तो यह चल रहा है, और अन्यथा इसे मार रहा है, तो आप इसे विश्वसनीय तरीके से करने के लिए psutil का उपयोग कर सकते हैं।

कुछ इस तरह:

import psutil
from subprocess import Popen

for process in psutil.process_iter():
    if process.cmdline() == ['python', 'StripCore.py']:
        print('Process found. Terminating it.')
        process.terminate()
        break
else:
    print('Process not found: starting it.')
    Popen(['python', 'StripCore.py'])

नमूना रन:

$python test_strip.py   #test_strip.py contains the code above
Process not found: starting it.
$python test_strip.py 
Process found. Terminating it.
$python test_strip.py 
Process not found: starting it.
$killall python
$python test_strip.py 
Process not found: starting it.
$python test_strip.py 
Process found. Terminating it.
$python test_strip.py 
Process not found: starting it.

नोट : पिछले psutil संस्करणों में cmdline एक विधि के बजाय एक विशेषता थी।


मैं वही काम करना चाहता था, लेकिन मैं इसे एक फाइल में करना चाहता था।

तो तर्क होगा:

  • अगर मेरे नाम के साथ एक स्क्रिप्ट चल रही है, तो इसे मारो, फिर बाहर निकलें
  • अगर मेरे नाम के साथ एक स्क्रिप्ट नहीं चल रही है, तो सामान करें

मैंने Bakuriu द्वारा जवाब संशोधित किया और इसके साथ आया:

from os import getpid
from sys import argv, exit
import psutil  ## pip install psutil

myname = argv[0]
mypid = getpid()
for process in psutil.process_iter():
    if process.pid != mypid:
        for path in process.cmdline():
            if myname in path:
                print "process found"
                process.terminate()
                exit()

## your program starts here...

स्क्रिप्ट चलाना जो भी स्क्रिप्ट करता है। स्क्रिप्ट का एक और उदाहरण चलाना स्क्रिप्ट के किसी भी मौजूदा उदाहरण को मार देगा।

मैं इसका उपयोग थोड़ा पीजीजीटीके कैलेंडर विजेट प्रदर्शित करने के लिए करता हूं जो घड़ी पर क्लिक करते समय चलता है। अगर मैं क्लिक करता हूं और कैलेंडर ऊपर नहीं है, कैलेंडर प्रदर्शित करता है। यदि कैलेंडर चल रहा है और मैं घड़ी पर क्लिक करता हूं, कैलेंडर गायब हो जाता है।





terminal