[英]Identify Python Subprocess from terminal
我们开发了一个 python function,它使用 pdftoppm/pdftocairo 启动子进程调用来拆分 pdf 并将每个页面存储为单独的图像。 假设一个文档有 10 页,它会创建 10 个单独的 png 文件,每个文件代表文档的页面。 有没有办法使用htop
或ps -ef
命令从终端拦截进程?
如果您想要获取子进程时 Python 程序仍在运行,最简单的解决方案可能是将timeout
关键字参数传递给Popen.wait()
或Popen.communicate()
。
subprocs = []
for page in pdf.pages():
sub = subprocess.Popen(['pdftoppm', 'etc', '--page', str(page), filename])
subprocs.append(sub)
# some Python processing here while you wait for the subprocesses to run in the background?
# Then once you are done and only want to reap them before you continue
for sub in subprocs:
sub.wait(timeout=60)
当您wait
已经完成的子进程时,调用会立即返回。 当您wait
已经超过其超时的子进程时,这也应该(大致)立即进行。 所以最终for
循环应该有效地等待第一个尚未完成或超过其超时的子进程,然后快速收获 rest。
如果您的 Python 程序已经完成执行并且您还有一堆子进程正在运行,那么您启动的子进程将是孤儿,它们被重新定义为 PID 1 的子进程,因此您无法再检查父进程并查看它们是否属于您. 如果它们都在没有其他进程正在执行的特定目录中运行,那么这可能是隔离它们的好方法。 (在subprocess.Popen()
中,您可以使用cwd=path_to_dir
传入目录。)在 Linux 上, /proc
文件系统允许您轻松遍历进程树并检查各个进程。 进程树中的cwd
条目是进程运行所在目录的符号链接。
from pathlib import Path
for proc in Path('/proc').iterdir():
if all(x.isdigit() for x in proc.name):
if proc/'cwd'.readlink() == '/path/to/dir':
print(proc)
不幸的是, Path.readlink()
仅在 Python 3.9 中引入; 如果您在具有较旧 Python 版本的机器上需要此功能,请尝试更传统的os.path
spaghetti:
import os
for proc in os.listdir('/proc'):
if all(x.isdigit() for x in proc):
if os.readlink(os.path.join('/proc', proc, 'cwd')) == '/path/to/dir':
print(proc)
请注意, /proc
不可移植,但由于您特别询问 Ubuntu,您应该可以使用这种方法。
如果您不想在特定的唯一目录中运行子进程,则可能有其他方法可以找到您的进程(如果它们是相当唯一的,或者使它们合理唯一以促进这一点)。 您的问题确实没有充分揭示您的代码或您的要求,无法知道究竟什么对您有用。
也许您可以使用外部timeout
命令运行进程并将其保留。 GNU Coreutils timeout
二进制文件是 Ubuntu 基本安装的一部分(但在某些其他 U*x 类系统上可能不可用)。
for page in pdf.pages():
subprocess.Popen(['timeout', '60', 'pdftoppm', 'etc', '--page', str(page), filename])
(上面显然猜测你正在运行的实际命令以及它需要什么参数。)
如果您实际上是通过子流程模块运行该流程,那么它应该显示为常规(子)流程,是的。
>>> from subprocess import run
>>> run('/usr/bin/cat')
将导致:
$ ps -u myuser
...
36456 pts/2 00:00:00 python3
36463 pts/2 00:00:00 cat
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.