Skip to main content
 首页 » 编程设计

python之用 pexpect 杀死一个 sudo/root 进程

2025年05月04日17落叶无声

给定一个使用 sudo 打开的预期衍生进程,如下所示:

#!/usr/bin/env python 
import pexpect 
 
cmd = ['sudo', 'bash', '-c', '"some long-running sudo command"'] 
cmd = ' '.join(cmd) 
child = pexpect.spawn(cmd, timeout=60) 
 
i = child.expect([ 
  'success', 
  'error']) 
if i == 0: 
  print('ok') 
else: 
  print('fail') 
  # insert code here 

我如何在失败(或成功,就此而言)时终止此进程?

我尝试了以下方法(替换 # insert code here):

child.kill(0) 
child.close(force=True) 

两者都给出以下错误,这是有道理的,因为 Python 脚本不是根进程,并且它正试图杀死根进程。 p>

Traceback (most recent call last): 
  File "./myscript.py", line 85, in <module> 
    requires_qemu() 
  File "./myscript.py", line 82, in requires_qemu 
    child.close(0) 
  File "/usr/lib/python2.7/site-packages/pexpect/__init__.py", line 747, in close 
    raise ExceptionPexpect('Could not terminate the child.') 
pexpect.ExceptionPexpect: Could not terminate the child. 

由于文件权限的原因,无法以 root 身份运行脚本(从阻止 root 访问的共享 NFS 驱动器运行)

请您参考如下方法:

使用 sudo 以 root 身份杀死它:

subprocess.call(['sudo', 'kill', str(child.pid)])