我做了
python py_prog.py | java scalaProg.Pkg
Python 程序必须从数据库获取内容并将其通过管道传递给 Scala 程序。我们对 python 进行了集中错误监控,但 scala 程序可能会默默地失败。因此,如果 Scala 程序失败,我希望使用第三个程序将其 stderr 转移到我们的监控系统,如 bash 伪代码:
(python py_prog.py | java scalaProg.Pkg) || python logging_program.py
(编写 logging_program
并使其与我们的错误监控对话很容易,为 scala 程序设置类似的系统很困难)。
那么我该如何实现:
- 当 scalaProg 失败时,将其 stderr 通过管道传输到第三个程序
- 处理
IOError: [Errno 32] Broken pipe
当 scalaProg 失败时在 py_prog 中
最佳答案
使用 bash,您可以使用进程替换,并且您仍然会看到 java scalaProg.Pkg
的输出:
python py_prog.py | java scalaProg.Pkg 2> >(python logging_program.py)
或者您可以将其放在 tee 上以在终端上查看 stderr:
python py_prog.py | java scalaProg.Pkg 2> >(tee >(python logging_program.py))
如果是运行 java scalaProg.Pkg
的 shell 发送错误消息,您可以将其封装在子 shell 中以获取错误:
python py_prog.py | (java scalaProg.Pkg;) 2> >(tee >(python logging_program.py))
如果您需要获取所有内容(来自 java scalaProg.Pkg
的标准输出和标准错误,请执行以下操作:
python py_prog.py | java scalaProg.Pkg > >(tee >(python logging_program.py)) 2>&1
或者这个:
python py_prog.py | (java scalaProg.Pkg;) > >(tee >(python logging_program.py)) 2>&1
如果您想从 python py_prog.py
和 java scalaProg.Pkg
获取所有 stdout 和 stderr,请执行以下操作:
{python py_prog.py | java scalaProg.Pkg;} > >(tee >(python logging_program.py)) 2>&1
或者这也包括调用 shell 可能生成的错误:
(python py_prog.py | java scalaProg.Pkg;) > >(tee >(python logging_program.py)) 2>&1
如果您只想从 session 中获取 stderr,则只需使用 2>
:
(python py_prog.py | java scalaProg.Pkg;) 2> >(tee >(python logging_program.py))
关于python - 如何确保报告管道中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18118809/