stderrをリダイレクトした後のbashスクリプトの出力のパイピング[終了]


9

私のホスティング業者がサービスをするためにシステムを使わなければならないことをする方法のために。

このサービスには実行ファイルがあり、それを実行して2番目の実行ファイルにパイプします。しかし、私はstdoutの代わりにstderrにログを記録する(与えられた)pythonパッケージを使用しており、私が望んでいることを実行できません。

だから私は私のサービスのための実行スクリプトを持っています:

#!/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を2つのファイルにリダイレクトすると、リダイレクトがないことが示されます(stderrはまだstderrにあります)。リダイレクトを機能させるにはどうすればよいですか?


5
exec ... 2>&1実際に標準エラーを標準出力に結合します。だから何か他のものがおかしい。
2016年

3
Pythonスクリプトがstderrを閉じて、ファイルとして再び開く可能性はありますか?dup2()コード内での呼び出しを探します。stderr出力どこに行くのか考えていますか?別の考え:コードを開始する前に、ホストの実行ファイルがstderrをこのようにリダイレクトしている可能性があります。
エドワードフォーク2016年

1
テキストがstderrに送信されていることを完全に確認できますか?スクリプトを、import sys; print("Hello, stderr", file=sys.stderr)確かだと言うスクリプトに置き換えます。
rosuav 2017

3
本当にstderr?これexec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.logを試して、このログファイルを調べてください。
ingopingo 2017

2
shの代わりにbashを使用するとどうなりますか?
Luciano Andress Martini

回答:


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のプロセスに置き換えます。移植性は低いですが、通常は信頼性がはるかに優れているため、shではなくbashに切り替えたことに注意してください。これがうまくいけば、すごい、そうでないにしても、より優れた知識のある人が介入します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.