![stderrをリダイレクトした後のbashスクリプトのパイプ出力[閉じる]](https://linux33.com/image/9106/stderr%E3%82%92%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%81%97%E3%81%9F%E5%BE%8C%E3%81%AEbash%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E3%83%91%E3%82%A4%E3%83%97%E5%87%BA%E5%8A%9B%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
ホストが働く方法のためにサービスを提供するには、システムを使用する必要があります。
サービスには、実行され、2番目の実行可能ファイルにパイプされる実行可能ファイルがあります。しかし、(与えられた)Pythonパッケージを使用してstdoutの代わりにstderrにログインしていますが、目的の操作を実行することはできません。
したがって、サービス用の実行スクリプトがあります。
#!/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
しかし、これは私の問題を解決しません。私自身の出力(pythonを使用してstdoutとして印刷)は期待どおりに記録されます。 stderr 出力を記録しないでください。
変更された実行スクリプトを両方のファイルにリダイレクトすると、リダイレクトがないと表示されます(stderrはまだstderrにあります)。リダイレクトが機能するにはどうすればよいですか?
答え1
試してみてください:
#!/usr/bin/env bash
exec 2>&1
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py
つまり、exec 2>&1
別の行でstdoutがアクセスするのと同じエントリ(ターミナル?またはcrontabにある場合はメール?)にstderrをリダイレクトするように指示し、cdとexecを使用して既存のプロセスをpython3.2プロセスに置き換えます。移植性は低下しますが、一般的に安定性が良いため、shの代わりにbashに切り替えました。これがうまくいけばいいでしょう。そうでなければ、知識が豊富な人が介入します。 (今はこれについて研究する時間がありません)