相关疑难解决方法(0)

如何终止使用shell = True启动的python子进程

我正在使用以下命令启动子进程:

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().

python linux subprocess kill-process

285
推荐指数
7
解决办法
26万
查看次数

即使直系孩子已经终止,Popen仍在等待孩子的过程

我在Windows 8/XP上使用Python 2.7.

我有一个程序A使用以下代码运行另一个程序B:

p = Popen(["B"], stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate()
return
Run Code Online (Sandbox Code Playgroud)

B运行批处理脚本C. C是一个长时间运行的脚本,我希望B退出,即使C还没有完成.我使用以下代码完成了它(在B中):

p = Popen(["C"])
return
Run Code Online (Sandbox Code Playgroud)

当我运行B时,它按预期工作.然而,当我运行A时,我预计它会在B退出时退出.但是A等到C退出,即使B已经退出了.关于发生了什么以及可能的解决方案的任何想法?

不幸的是,将A改为看起来像B的明显解决方案不是一种选择.

以下是用于说明此问题的功能示例代码:https: //www.dropbox.com/s/cbplwjpmydogvu2/popen.zip?dl = 1

任何输入都非常感谢.

python subprocess popen

15
推荐指数
1
解决办法
6751
查看次数

如何在 Linux 中显示进程状态(阻塞、非阻塞)

有没有办法在 Linux 进程表中查询进程的状态,以便能够证明在执行查询时进程是正在运行还是被阻塞?我的目标是从进程或程序的“外部”执行此操作,因为我希望从操作系统进程的角度理解这一点,但欢迎提出任何想法!

这是python代码阻塞的过程:

import subprocess
proc = subprocess.call('ls -lRa /', shell=True)
Run Code Online (Sandbox Code Playgroud)

这是非阻塞进程的python代码:

import subprocess
proc = subprocess.Popen('ls -lRa /', shell=True)
Run Code Online (Sandbox Code Playgroud)

这是显示进程 ID 的“ps -ef”的输出:

UID        PID  PPID  C STIME TTY          TIME CMD
user1    14308  4145  0 15:30 pts/2    00:00:00 python call_b.py
user1    14309 14308  0 15:30 pts/2    00:00:00 /bin/sh -c ls -lRa /
user1    14310 14309 15 15:30 pts/2    00:00:30 ls -lRa /
root     14313     2  0 15:31 ?        00:00:00 [kworker/2:0]
user1    14318  2476  0 15:32 pts/4    00:00:00 -bash …
Run Code Online (Sandbox Code Playgroud)

python linux process nonblocking blocking

4
推荐指数
1
解决办法
7093
查看次数

如何使用 python subprocess() 运行多个命令而不等待每个命令结束?

此任务涉及两个 python 脚本。

我当前的任务要求我在 GCP 实例上的 29 个可用区域中的每一个中运行一个很长的过程(每个过程大约需要一两天,这是第一个 python 脚本)。为了尽快完成任务,我尝试在一次性分拆 29 个虚拟机后同时运行每个实例中的每个进程。

由于通过 SSH 手动运行第一个脚本到每个实例非常麻烦,因此我编写了一个python 脚本(第二个脚本),通过 SSH 连接到每个区域的虚拟机并运行我上面提到的第一个脚本

在不同区域运行第一个脚本的第二个脚本的问题在于,它不会开始在第二个区域的虚拟机中运行第一个脚本,直到它在第一个区域的虚拟机中完成运行,而我需要第二个脚本来运行第一个脚本在每个区域中编写脚本,而无需等待第一个脚本启动的进程结束。

我在第二个脚本中使用 subprocess()在每个虚拟机中运行第一个脚本

以下代码是第二个脚本

for zone, instance in zipped_zone_instance:
    command = "gcloud compute ssh --zone " + zone + " " +  instance + " --project cloud-000000 --command"
    command_lst = command.split(" ")
    command_lst.append("python3 /home/first_script.py")
    subprocess.run(command_lst)
Run Code Online (Sandbox Code Playgroud)

我需要 subprocess.run(command_lst) …

python terminal subprocess google-compute-engine google-cloud-platform

0
推荐指数
1
解决办法
7659
查看次数