2

私は

python py_prog.py | java scalaProg.Pkg

Python プログラムは DB からデータを取得し、それを Scala プログラムにパイプする必要があります。Python のエラー監視を集中化しましたが、scala プログラムは黙って失敗する可能性があります。したがって、Scala プログラムが失敗した場合、次の bash 疑似コードのような 3 つ目のプログラムを使用して、その stderr を監視システムに転送する必要があります。

(python py_prog.py | java scalaProg.Pkg) || python logging_program.py

(記述logging_programしてエラー監視と通信させるのは簡単ですが、scala プログラム用に同様のシステムをセットアップするのは困難です)。

では、どうすれば達成できますか:

  1. scalaProg が失敗すると、stderr を 3 番目のプログラムにパイプします
  2. IOError: [Errno 32] Broken pipescalaProg が失敗したときの py_prog での処理
4

3 に答える 3

1

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エラーメッセージを送信するのが実行中のシェルである場合は、それをサブシェルにカプセル化してエラーを取得することもできます。

python py_prog.py | (java scalaProg.Pkg;) 2> >(tee >(python logging_program.py))

すべてを取得する必要がある場合 (stdout と stderr の両方から)、次のように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

すべての stdout と stderr を両方から取得したい場合は、次python py_prog.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

セッションから stderr のみを取得したい場合は、次を使用します2>

(python py_prog.py | java scalaProg.Pkg;) 2> >(tee >(python logging_program.py))
于 2013-08-08T06:48:52.120 に答える
0

以下を実行してください: https://stackoverflow.com/a/2342841/548696

python py_prog.py | java scalaProg.Pkg 2>&1 >/dev/null | python logging_program.py

これにより、stdout からすべてが削除され、stderr のみが Python スクリプトに渡されます。

それはあなたのために働きますか?

于 2013-08-08T06:20:24.927 に答える