重定向stderr后,对bash脚本的输出进行配管[关闭]


9

由于托管人的处理方式,我必须使用系统进行服务。

该服务有一个运行文件,它将执行该文件并将其传输到第二个运行文件中。但是我使用了一个(给定的)python程序包,该程序包记录到stderr而不是stdout,所以我无法让它做我想做的事情。

所以我有一个服务运行脚本:

#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py

它通过管道传送到日志记录系统的运行中:

#!/bin/sh
exec multilog t ./main

但是管道没有连接stderr(如预期的那样)。因此,在谷歌搜索之后,我向运行添加了重定向:

#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py 2>&1

但这不能解决我的问题:我自己的输出(使用pythons print输出到stdout)已按预期记录。stderr输出未记录。

如果将修改后的runscript重定向到两个文件中,则表明没有重定向(stderr仍在stderr上)。我必须如何修改重定向才能正常工作?


5
exec ... 2>&1确实将标准错误加入标准输出中。所以还有其他问题。
thrig

3
python脚本是否有可能关闭stderr并将其重新打开为文件?dup2()在代码中查找对的调用。任何想法,标准错误输出打算?另一个想法:托管人的运行文件可能在启动代码之前以这种方式重定向stderr。
爱德华·福尔克

1
您可以绝对确认是否将文本发送到stderr吗?请import sys; print("Hello, stderr", file=sys.stderr)以一定要替换的脚本替换脚本。
rosuav '17

3
真的是stderr吗?试试这个exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.log,看看这个日志文件。
ingopingo

2
如果使用bash而不是sh会发生什么?
Luciano Andress Martini

Answers:


0

请试试:

#!/usr/bin/env bash
exec 2>&1
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py

即:exec 2>&1在单独的一行上,告诉将stderr重定向到stdout将要重定向到的同一内容(您的终端?还是在crontab中发邮件?),然后执行cd&exec将现有进程替换为python3.2。请注意,我改用bash而不是sh,以降低便携性,但通常可靠性更高。如果这行得通,那么很好,甚至不是一些知识渊博的人也会介入。(我现在没有时间对此进行研究)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.