终止由子进程调用启动的脚本以模拟密钥

2024-04-26 03:55:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在运行一个python脚本,它使用popen方法执行一个使用subprocess模块的脚本。我遇到的问题是,即使我有一个terminate命令,我通过popen调用的脚本仍然在运行。 请注意-当我单独运行.par脚本时,终止它的唯一方法是发送一个击键-“e”+return。我的问题是如何在运行脚本5秒后终止它。这是我到目前为止得到的-

#! /usr/bin/python

import subprocess

pro = subprocess.Popen('/home/xxx/bin/xxy.par', shell=True)
out=pro.communicate()
print out ### this prints out the output of the .par script

pro.terminate() ### this is for killing the .par script

.par脚本运行时的输出。退出脚本的方法是发送键-e+enter。否则它将继续运行并不断报告状态信息。你知道吗

------------ [ Press key + <ENTER>: a=Attach, c=Config, d=Detach, e=Exit, l=Analyze, m=Airplane Mode, p=Toggle Ping, q=Toggle QXDM, r=ReAttach, s=ADB Shell ] ------------
I 09:56:26 <phase: control_ue> - RadioState: ON, Airplane Mode: OFF, RegState: REG_HOME, Data: CONNECTED, RAT: LTE, PING: OFF, QXDM: OFF, Battery: 100%
I 09:56:26 <phase: control_ue> -    , RSRP: -86, RSSNR: 30.0, RSRQ: -7, PCI: 24, TAC: 766666, eNB/cellId: ddd
------------ [ Press key + <ENTER>: a=Attach, c=Config, d=Detach, e=Exit, l=Analyze, m=Airplane Mode, p=Toggle Ping, q=Toggle QXDM, r=ReAttach, s=ADB Shell ] ------------
I 09:56:26 <phase: control_ue> - RadioState: ON, Airplane Mode: OFF, RegState: REG_HOME, Data: CONNECTED, RAT: LTE, PING: OFF, QXDM: OFF, Battery: 100%
I 09:56:26 <phase: control_ue> -    , RSRP: -86, RSSNR: 30.0, RSRQ: -7, PCI: 24, TAC: 766666, eNB/cellId: ddd
------------ [ Press key + <ENTER>: a=Attach, c=Config, d=Detach, e=Exit, l=Analyze, m=Airplane Mode, p=Toggle Ping, q=Toggle QXDM, r=ReAttach, s=ADB Shell ] ------------
I 09:56:26 <phase: control_ue> - RadioState: ON, Airplane Mode: OFF, RegState: REG_HOME, Data: CONNECTED, RAT: LTE, PING: OFF, QXDM: OFF, Battery: 100%
I 09:56:26 <phase: control_ue> -    , RSRP: -86, RSSNR: 30.0, RSRQ: -7, PCI: 24, TAC: 766666, eNB/cellId: ddd
------------ [ Press key + <ENTER>: a=Attach, c=Config, d=Detach, e=Exit, l=Analyze, m=Airplane Mode, p=Toggle Ping, q=Toggle QXDM, r=ReAttach, s=ADB Shell ] ------------

Tags: key脚本configmodecontrolpressentertoggle
1条回答
网友
1楼 · 发布于 2024-04-26 03:55:41

使用系统工具终止脚本

假设您在Posix系统(如Linux)上运行,则可以使用信号终止脚本,而不考虑可以使用特定于脚本的命令来请求脚本退出。您使用的^{}方法将SIGTERM发送到您的子进程。当脚本接收到那个信号时,它看起来并没有退出。您可以使用^{}方法发送其他信号。SIGINT通常是程序运行时按ctrl-c发送的信号。通常认为发送SIGTERMSIGINT是一个好主意,因为正在运行的程序可以捕获它们并执行它想要的任何清理。但这也意味着它可以捕捉到信号并完全忽略它。它不能忽略SIGKILL信号(您也可以使用^{}方法发送),因此如果其他信号不工作,您可以使用它。你知道吗

链接的文档解释了Windows系统上的不同行为。你知道吗

请注意,由于脚本需要stdin上的输入,因此您可能必须确保stdin已连接到管道,以免它挂起等待输入。你知道吗

import subprocess
import signal

pro = subprocess.Popen('/home/xxx/bin/xxy.par', shell=True, stdin=subprocess.PIPE)
out=pro.communicate()

# Ask your process to exit politely
pro.send_signal(signal.SIGINT) 

# Be more insistent (these are equivalent)
pro.send_signal(signal.SIGKILL)
pro.kill()

向脚本发送退出命令

因为脚本有一个退出命令,所以也可以通过stdin与它通信来发送该命令。当您通过将脚本上的stdin连接到管道来进行Popen调用时,必须对此进行设置。然后可以使用communcate方法向它发送命令:

import subprocess

pro = subprocess.Popen('/home/xxx/bin/xxy.par', shell=True, stdin=subprocess.PIPE)
out=pro.communicate("e")

相关问题 更多 >