通过子进程发出 kill
Issuing kill through subprocess
我正在尝试编写一个简单的 python 服务器来运行并终止另一个 python 脚本。我遇到的问题是 kill 命令没有错误地发出,但没有终止进程。我手动尝试 'kill -INT pid' 没有任何结果。
该命令在 shell 中有效,但在 python 中无效。我正在执行 'soft' 杀戮,因为脚本控制一盏灯,而 'kill -9' 不会关闭灯。
注意:脚本在 yocto-disr
上 运行
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
按照@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)
我正在尝试编写一个简单的 python 服务器来运行并终止另一个 python 脚本。我遇到的问题是 kill 命令没有错误地发出,但没有终止进程。我手动尝试 'kill -INT pid' 没有任何结果。
该命令在 shell 中有效,但在 python 中无效。我正在执行 'soft' 杀戮,因为脚本控制一盏灯,而 'kill -9' 不会关闭灯。
注意:脚本在 yocto-disr
上 运行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
按照@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)