重定向 stderr 后管道输出 bash 脚本

xav*_*vor 9 logs pipe io-redirection

由于我的托管人做事的方式,我必须使用系统来提供服务。

该服务有一个运行文件,它执行并通过管道传输到第二个运行文件中。但是我使用一个(给定的)python 包记录到 stderr 而不是 stdout,我无法让它做我想做的事。

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

#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/sh
exec multilog t ./main
Run Code Online (Sandbox Code Playgroud)

但是管道没有连接 stderr(如预期的那样)。所以在谷歌搜索之后,我在我的运行中附加了一个重定向:

#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py 2>&1
Run Code Online (Sandbox Code Playgroud)

但这并不能解决我的问题:我自己的输出(使用 python 打印到标准输出)按预期记录。不记录 stderr 输出。

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

Oli*_*lac 0

请尝试:

#!/usr/bin/env bash
exec 2>&1
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py
Run Code Online (Sandbox Code Playgroud)

即:exec 2>&1在单独的一行上,告诉将 stderr 重定向到 stdout 将要访问的相同内容(您的终端?或者邮件,如果在 crontab 中?),然后使用 cd 和 exec 将现有进程替换为 python3.2 进程。请注意,我改用 bash 而不是 sh,因为可移植性较低,但通常可靠性更好。如果这有效,那就太好了,如果不是的话,一些知识渊博的人会介入。(我现在没有时间对此进行研究)