首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >完美的包装器(用Python)

完美的包装器(用Python)
EN

Stack Overflow用户
提问于 2019-08-28 13:33:36
回答 1查看 253关注 0票数 0

我运行了一个配置管理工具,它调用/usr/bin/dpkg,但没有显示stdout/stderr。

有些地方出了问题,我想调试问题的根源。

我希望看到对dpkg和stdout/stderr的所有调用。

我将最初的/usr/bin/dpkg移到/usr/bin/dpkg-orig上,并编写了一个包装器:

代码语言:javascript
运行
复制
#!/usr/bin/env python
import os
import sys
import datetime
import subx
import psutil
cmd=list(sys.argv)
cmd[0]='dpkg-orig'

def parents(pid=None):
    if pid==1:
        return '\n'
    if pid is None:
        pid = os.getpid()
    process = psutil.Process(pid)
    lines = [parents(process.ppid())]
    lines.append('Parent: %s' % ' '.join(process.cmdline()))
    return '\n'.join(lines)

result = subx.call(cmd, assert_zero_exit_status=False)
with open('/var/tmp/dpkg-calls.log', 'ab') as fd:
    fd.write('----------- %s\n' % (datetime.datetime.now()))
    fd.write('%s\n' % parents())
    fd.write('stdout:\n%s\n\n' % result.stdout)
    sys.stdout.write(result.stdout)
    fd.write('stderr:\n%s\n' % result.stderr)
    fd.write('ret: %s\n' % result.ret)
    sys.stderr.write(result.stderr)
sys.exit(result.ret)

现在,我再次运行配置管理工具,并搜索非零"ret:“行。

产出:

代码语言:javascript
运行
复制
Parent: /usr/bin/apt-get -q -y -o DPkg::Options::=--force-confold -o DPkg::Options::=--force-confdef install openssl-foo-bar-aptguettler.cert
Parent: python /usr/bin/dpkg --force-confold --force-confdef --status-fd 67 --no-triggers --unpack --auto-deconfigure /var/cache/apt/archives/openssl-foo-bar-aptguettler.cert_1-2_all.deb

stdout:


stderr:
dpkg: error: unable to read filedescriptor flags for <package status and progress file descriptor>: Bad file descriptor

ret: 2

这是因为我的包装还不完美。

调用dpkg的工具希望读取文件描述符,但这不适用于我的包装器。

我的目标是:

  • 捕获对dpkg的所有调用并将其写入日志文件(有效)
  • 写出父进程(工作)
  • dpkg的父进程不应该注意到差异,也不会像上面那样失败(还不起作用)。

知道如何做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-02 08:04:47

我编写了一个简单的python脚本来解决这个问题:

calls

包装器来记录对linux命令的所有调用。 特定用例:我的配置管理工具调用/usr/bin/dpkg。发生了一个错误,但不幸的是,我的配置管理工具没有向我展示整个stdout/stderr。我不知道怎么回事。 一般用例:包装linux命令,如/usr/bin/dpkg,并写出对此的所有调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57693713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档