一尘不染

如何使用pid从Python终止进程?

linux

我正在尝试在python中编写一些短脚本,如果尚未启动该脚本,则会在子进程中启动另一个python代码,否则终止终端机和应用程序(Linux)。

所以看起来像:

#!/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”中 读取的pid来命名进程的知识,存在问题。另一个问题是解释器说名为 dat的 字符串不等于 “ x”
?我错过了什么?


阅读 695

收藏
2020-06-02

共1个答案

一尘不染

使用很棒的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属性 而不是方法。

2020-06-02