系统相关
首页 > 系统相关> > 如何在python中限制子进程stdout和stderr的大小

如何在python中限制子进程stdout和stderr的大小

作者:互联网

我需要运行用户提交的应用程序.我的代码看起来像:

def run_app(app_path):
    inp = open("app.in", "r")
    otp = open("app.out", "w")

    return subprocess.call(app_path, stdout=otp, stdin=inp)

既然我无法控制用户提交的内容,我想限制应用程序输出的大小.其他诸如尝试访问未经授权的系统资源和滥用CPU周期等因素正受到apparmor规则实施的限制.允许运行的最长时间由父进程处理(在python中).现在,一个流氓应用程序仍然可以尝试通过向stdout写入大量数据来充斥服务器系统,因为知道stdout正在保存到文件中.

我不想在stdout / stderr文件中使用AppArmors RLIMIT或内核模式的任何东西.能够使用标准库从python中完成它会很棒.

我目前正在考虑创建文件的子类,并在每次写入时检查已经向流写入了多少数据.或者创建一个设置了最大长度的内存映射文件.

但我觉得可能有一种更简单的方法来限制文件大小我还没有看到它.

解决方法:

子类化文件或创建其他伪文件Python对象根本不起作用,因为该文件将在子进程中使用 – 因此它必须是O.S.文件,而不是Python类对象.子进程不会发送您的Python对象供其他进程使用.

虽然Python对内存映射文件有本机和简单的支持,但是通过mmap模块,内存映射并不适用于此:您可以指定镜像到内存的文件大小,但是您不能将写入限制为文件根本就是:多余的数据将被简单地写入磁盘而不被映射. (并且,再次,您将磁盘文件传递给子进程,而不是mmap对象).有可能在某个时刻创建一个带有sentinel值的文件,并保持一个线程检查是否覆盖了sentinel,此时它可以杀死子进程 – 但我怀疑这是否可靠.

然后,有磁盘活动监视工具,例如inotify:您可以使用pyinotify到主进程上的处理程序,只要访问该文件就会调用该处理程序.缺点:“文件写入”没有事件 – 只是“文件已经过时” – 我不确定是否会通过文件的增量写入触发任何可能的事件.而且,尽管如此,如果子进程在一次系统调用中完成所有的写入操作,那么无论如何都会被告知太晚.

所以,我能想到的就是:在一个人为有限的文件系统中创建一个文件.这样,OS将在超过max-size时阻止写入.

在Linux下,您可以预先创建一个具有所需大小的文件,在其上创建一个FS,然后使用“循环”接口安装它 – 然后只需在该文件系统中创建stdout和sterr文件,并调用您的子进程.

您可以根据需要预先创建和预安装这样的文件系统池 – 或者,甚至可以动态创建它们 – 但这需要创建FS主机文件的步骤,在其上创建文件系统结构(mkfs)并安装它 – 所有这些都可能是很多开销.

总而言之,也许您只需使用Apparmor自己的rlimit设置就可以了.

标签:python,subprocess,linux,stdout,apparmor
来源: https://codeday.me/bug/20190701/1351135.html