2013-07-25 103 views
22

我想在python中編寫一些簡短的腳本,這將在子流程中啓動另一個python代碼,如果尚未啓動,則終止終端&應用程序(Linux)。如何使用pid終止Python進程?

所以它看起來像:

#!/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) 

有由pid其應用從文件「.PROC」讀缺乏知識名理線的問題。 另一個問題是解釋器說名爲dat的字符串不等於「x」 ???我錯過了什麼?

+2

你爲什麼要傳遞'shell = True'? AFAIK在你的用例中不需要。還要注意,當使用'shell = True'時,由'p.pid'返回的pid不是python進程的pid,而是shell的pid生成執行這個進程。 – Bakuriu

+0

+1您的評論,但我認爲這是適當的,因爲我需要關閉終端。 – Alex

回答

52

使用真棒psutil庫這是很簡單的:

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

如果你不想安裝一個新的圖書館,你可以使用os模塊:

import os 
import signal 

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

如果如果它沒有運行,則您有興趣啓動python StripCore.py命令,否則,可以使用psutil來執行此可靠性LY。

喜歡的東西:

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. 

注意:在以前的psutilcmdline版本是一個屬性替代的方法。

+0

謝謝,但對我來說主要問題是如何獲得正在運行的應用程序的PID? – Alex

+3

@Alex你是什麼意思?你想終止正在執行的進程嗎?然後只需使用'sys.exit()'。如果你想使用'os.getpid()'來訪問當前進程的'pid'。 – Bakuriu

+0

at_Bakuriu請原諒我(mi dispiace)。我只是想製作腳本,如果它沒有啓動,它將運行一些應用程序。如果應用程序啓動,終止這個應用程序,並自我。 – Alex

2

我想做同樣的事情,但我想在一個文件中做到這一點。

所以邏輯是:

  • 如果用我的名字在腳本運行,殺死它,然後退出
  • 如果有我名字的腳本不運行,做的東西

我修改了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... 

運行腳本將做任何事情該腳本確實如此。運行腳本的另一個實例將會終止該腳本的任何現有實例。

我用它來顯示一個點擊時鐘時運行的小PyGTK日曆小部件。如果我點擊並且日曆不在,日曆顯示。如果日曆正在運行,並且我點擊時鐘,日曆就會消失。