使用 Python 子进程跟踪可执行文件创建的文件



我是python和Redhat linux的新手。我正在使用子流程模块执行另一个创建文件的 C 程序。我能够从 C 程序中捕获退出代码。但是有什么方法也可以使python跟踪并显示C程序创建的文件的名称吗?

注意:我无法修改 C 程序。C 程序创建带有时间戳的输出文件,它的许多实例可以并行运行。我只想捕获由python运行的实例创建的文件。如果不是子流程模块,还有其他方法可以做到这一点吗?

是的,前提是您可以获取 C 程序的进程 ID。 您可以使用从 subprocess.Popen 返回的对象的 pid 属性来执行此操作。

获得 pid 后,您可以在 /proc 文件系统中打开进程的条目,然后查看 fd 子目录。 这包含指向进程已打开的所有文件的符号链接。 可以点击这些链接以获取真实的文件名。

例如,这将返回文件名列表:

import re
import os
def get_filenames(pid):
    dir = '/proc/' + str(pid) + '/fd'
    if not os.access(dir, os.R_OK|os.X_OK): return
    filenames = []
    for fds in os.listdir(dir):
        for fd in fds:
            full_name = os.path.join(dir, fd)
            try:
                 filename = os.readlink(full_name)
                 if filename == '/dev/null' or 
                   re.match(r'pipe:[d+]',file) or 
                   re.match(r'socket:[d+]',file):
                      filename = None
            except OSError as err:
                if err.errno == 2:     
                    filename = None
                else:
                    raise(err)
            if filename:
                filenames.append(filename)  
    return filenames

或者,下载psutil https://pypi.python.org/pypi/psutil 并使用get_open_files()方法。

请注意,无论使用哪种机制,都可能存在争用条件,因为通常您不知道 C 程序何时打开或关闭文件。

最新更新