【问题标题】:Python: How do I send a SIGINT signal to program opened with 'xterm -e ...'?Python:如何向使用“xterm -e ...”打开的程序发送 SIGINT 信号?
【发布时间】:2021-05-24 22:06:46
【问题描述】:

我正在尝试使用 Python 向通过subprocess.Popen 创建的进程发送 SIGINT 信号。我需要运行 test.bash 并在新窗口中打开它,然后等待 4 秒,发送 SIGINT(相当于使用 Ctrl-C)所以我使用以下代码:

command = "xterm -e bash test.bash"
process = subprocess.Popen(command.split())

time.sleep(4)
os.kill(process.pid, signal.SIGINT)

我设置了“test.bash”来捕获 SIGINT 信号,并运行清理命令。这在我直接从命令行运行“test.bash”时有效。但是当我在 Python 中通过xterm -e bash test.bash 发送它时,它会立即完全终止进程并且根本不处理 SIGINT 信号。

我已经尝试了一些我在网上阅读的关于杀死进程组的内容,但这也没有做任何事情。我尝试用process.send_signal(signal.SIGINT) 替换os.kill(process.pid, signal.SIGINT) 无济于事。有什么想法吗?

【问题讨论】:

  • 您将信号发送到xterm 进程。没有直接的方法可以获取bash 进程的PID。
  • @Barmar 有没有间接的方法来获取bash进程的PID?
  • 您可以让test.bash 将其 PID 写入文件并使用它。
  • 你可以像thispointer.com/…这样查找pid

标签: python linux bash subprocess


【解决方案1】:

您可能需要将-hold 选项添加到xterm,即xterm -hold -e... 以防止它在bash 脚本完成后关闭,因为您在python 中而不是shell 中使用睡眠。

如果您无法获得正确的 PID,用此替换第二行可能会起作用:

cmd = "pgrep -f 'xterm -e bash test.bash'"
id = subprocess.check_output(cmd, shell=True)

然后用id代替process.pid

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2017-05-07
    相关资源
    最近更新 更多