【问题标题】:Issuing kill through subprocess通过子进程发出kill
【发布时间】:2016-03-20 21:57:32
【问题描述】:

我正在尝试编写一个简单的 python 服务器来运行并杀死另一个 python 脚本。我遇到的问题是 kill 命令发出时没有错误,但不会终止进程。我已经手动尝试了“kill -INT pid”,但没有任何结果。

该命令在 shell 中有效,但在 python 中无效。我正在执行“软”杀戮,因为脚本控制灯光,而“杀戮 -9”不会关闭灯光。

注意:脚本在 yocto-distr 上运行

import socket, subprocess

srv = socket.socket()
srv.bind(('', 1340))
srv.listen(3)
while 1:
    connection, address = srv.accept()
    data = int(connection.recv(1024))
    if data == 0:
        ps_id = subprocess.check_output('ps|grep python\ /home/root/python/backlight_mod.py', shell=True)
        ps_id = ps_id.split(' ')[2]
        subprocess.call('kill -INT ' + str(ps_id), shell=True)
        print 'Terminated'
    elif data == 1:
        subprocess.call('python ~/python/backlight_mod.py &', shell=True)
    connection.close()

'kill -l' 的输出:

HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS RTMIN RTMIN+1 RTMIN+2 RTMIN+3 RTMIN+4 RTMIN+5 RTMIN+6 RTMIN+7 RTMIN+8 RTMIN+9 RTMIN+10 RTMIN+11 RTMIN+12 RTMIN+13 RTMIN+14 RTMIN+15 RTMAX-14 RTMAX-13 RTMAX-12 RTMAX-11 RTMAX-10 RTMAX-9 RTMAX-8 RTMAX-7 RTMAX-6 RTMAX-5 RTMAX-4 RTMAX-3 RTMAX-2 RTMAX-1 RTMAX

【问题讨论】:

  • 您应该检查ps 的原始输出以确保它实际上列出了请求的进程,并使用os.kill 来终止进程而不是生成另一个进程。

标签: shell subprocess kill


【解决方案1】:

按照@Petesh 的建议考虑 os.kill,这样您的代码将如下所示:

if data == 0:
    ps_id = subprocess.check_output('ps|grep python\ /home/root/python/backlight_mod.py', shell=True)
    ps_id = ps_id.split(' ')[2] 
    os.kill(pid, 3)
    print 'Terminated'

还要考虑以下提取pid:

p = subprocess.Popen(['ps', '-A'], stdout = subprocess.PIPE)
out, err = p.communicate()

for process in out.splitlines():
  if 'backlight_mod.py' in process:
    pid = int(process.split(None, 1)[0])
    os.kill(pid, 3)

【讨论】:

    猜你喜欢
    • 2019-06-02
    • 2014-05-12
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 2012-11-22
    • 2023-03-26
    • 1970-01-01
    • 2016-08-08
    相关资源
    最近更新 更多