【问题标题】:Kill a sudo/root process with pexpect用 pexpect 杀死一个 sudo/root 进程
【发布时间】:2014-05-03 13:42:02
【问题描述】:

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

#!/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 驱动器运行)

【问题讨论】:

  • kill(0) 可能不会做任何事情 - 没有信号 0。终止无响应进程的常见方法是 SIGTERM (15) 和 SIGKILL (9)。信号编号在signal 模块中作为常量提供。

标签: python python-2.7 pexpect


【解决方案1】:

使用sudo以root身份杀死它:

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

【讨论】:

  • 聪明。但是,是否可以在pexpect 的上下文中进行操作?
  • 当然,您当然也可以使用pexpect.spawn(),但只是subprocess 似乎更干净,因为您没有使用任何交互功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 2018-08-05
相关资源
最近更新 更多