我正在使用以下命令启动子进程:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用时杀死:
p.terminate()
Run Code Online (Sandbox Code Playgroud)
要么
p.kill()
Run Code Online (Sandbox Code Playgroud)
该命令在后台继续运行,所以我想知道如何实际终止该进程.
请注意,当我运行命令时:
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
它在发出时会成功终止p.terminate().
在C++ Windows应用程序中,我启动了几个长时间运行的子进程(目前我使用CreateProcess(...)来执行此操作.
如果我的主进程崩溃或关闭,我希望子进程自动关闭.
由于要求这需要对"父"的崩溃起作用,我认为这需要使用操作系统的某些API /功能来完成.这样就可以清理所有"子"进程.
我该怎么做呢?
子进程以#开头
subprocess.Popen(arg)
Run Code Online (Sandbox Code Playgroud)
如果父母异常终止,有没有办法确保它被杀死?我需要这个在Windows和Linux上都可以工作.我知道这个Linux解决方案.
编辑:
subprocess.Popen(arg)如果使用不同的启动流程的方法存在解决方案,则可以放宽启动子流程的要求.
我想知道在杀死在不同线程中启动的子进程时是否可以关闭通信管道.如果我不调用communic(),那么kill()将按预期工作,在一秒钟而不是五秒后终止进程.
我在这里找到了一个类似问题的讨论,但我没有得到真正的答案.我假设我要么必须能够关闭管道,要么明确地杀死子子进程(在示例中为"sleep")并杀死它以取消阻塞管道.
我也试着在SO上找到她的答案,但是我只发现了这个以及这个,而且这个并没有直接解决这个问题,据我所知(?).
所以我想要做的是能够在第二个线程中运行命令并获取其所有输出,但是当我愿意时能够立即杀死它.我可以通过一个文件和尾巴那个或类似的,但我认为应该有一个更好的方法来做到这一点?
import subprocess, time
from threading import Thread
process = None
def executeCommand(command, runCommand):
Thread(target=runCommand, args=(command,)).start()
def runCommand(command):
global process
args = command.strip().split()
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE)
for line in process.communicate():
if line:
print "process:", line,
if __name__ == '__main__':
executeCommand("./ascript.sh", runCommand)
time.sleep(1)
process.kill()
Run Code Online (Sandbox Code Playgroud)
这是脚本:
#!/bin/bash
echo "sleeping five"
sleep 5
echo "slept five"
Run Code Online (Sandbox Code Playgroud)
产量
$ time python poc.py
process: sleeping five
real 0m5.053s
user 0m0.044s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud) 如何测试我的程序对于意外关闭的鲁棒性?
我的 python 代码将在意外关闭的微控制器上运行。我想测试意外重新启动的代码的每个部分,并验证它是否正确处理此问题。
尝试:我尝试将代码放入其自己的进程中,然后提前终止它,但这不起作用,因为 MyClass 从命令行调用 7zip,即使进程终止后,该命令仍会继续:
import multiprocessing
import os
def MyClass(multiprocessing.Process):
...
def run():
os.system("7z a myfile.7z myfile")
process = MyClass()
process.start()
time.sleep(4)
print("terminating early")
process.terminate()
print("done")
Run Code Online (Sandbox Code Playgroud)
我想要的是:
class TestMyClass(unittest.TestCase):
def test_MyClass_continuity(self):
myclass = MyClass().start()
myclass.kill_everything()
myclass = MyClass().start()
self.assert_everything_worked_as_expected()
Run Code Online (Sandbox Code Playgroud)
是否有捷径可寻?如果没有,您如何设计可以在任何点终止的健壮代码(例如测试状态机)?
类似的问题(截至 21 年 10 月 26 日尚未回答):Simizing异常终止 in pytest
多谢!
python error-handling microcontroller multiprocessing pytest
我试图检测安装程序何时从Python脚本中执行.具体来说,该应用程序是Oracle 10gR2数据库.目前我正在使用Popen的子进程模块.理想情况下,我只是使用wait()方法等待安装完成执行,但是,记录的命令实际上生成子进程来处理实际安装.以下是失败代码的示例代码:
import subprocess
OUI_DATABASE_10GR2_SUBPROCESS = ['sudo',
'-u',
'oracle',
os.path.join(DATABASE_10GR2_TMP_PATH,
'database',
'runInstaller'),
'-ignoreSysPrereqs',
'-silent',
'-noconfig',
'-responseFile '+ORACLE_DATABASE_10GR2_SILENT_RESPONSE]
oracle_subprocess = subprocess.Popen(OUI_DATABASE_10GR2_SUBPROCESS)
oracle_subprocess.wait()
Run Code Online (Sandbox Code Playgroud)
还有一个类似的问题在这里:杀害包括其子女从蟒蛇一子,但所选择的答案没有解决孩子的问题,而是指示用户直接调用应用程序等待.我正在寻找一个等待子进程的所有子进程的特定解决方案.如果有不确定数量的子流程怎么办?我将选择解决等待所有子进程完成的问题的答案.
更清楚失败:子进程在wait()命令之后继续执行,因为该命令只等待顶级进程(在这种情况下它是'sudo').下面是这个问题中已知子进程的简单图表:Python子进程模块 - > Sudo - > runInstaller - > java - >(未知)
我想编写一个Windows脚本,该脚本要等到给定进程(PID)结束后再执行某些操作。到目前为止,我有(PID = 1234):
:loop
set VAR="tasklist | find /i " 1234 " /c"
if NOT (' %VAR% ')=="0" goto loop
**do something**
Run Code Online (Sandbox Code Playgroud)
但已经行了
set VAR="tasklist | find /i " 1234 " /c"
Run Code Online (Sandbox Code Playgroud)
不起作用,它存储字符串而不是求值。还是应该这样?在这种情况下
if NOT (' %VAR% ')=="0" goto loop
Run Code Online (Sandbox Code Playgroud)
应该评估VAR的内容,但是如果我在控制台中手动输入,我会得到
"tasklist | find /i " was unexpected
Run Code Online (Sandbox Code Playgroud)
我了解其中的双引号
set VAR="tasklist | find /i " 1234 " /c"
Run Code Online (Sandbox Code Playgroud)
是有问题的,但是我需要在PID的每一侧都留一个空格(在示例中为1234),以确保它不是另一个进程(例如12345)的子字符串,才能正常工作。
有任何DOS专家吗?
python ×5
subprocess ×4
kill ×2
linux ×2
windows ×2
batch-file ×1
kill-process ×1
oracle10g ×1
pipe ×1
process ×1
pytest ×1
spawning ×1
stdout ×1