2

RocksクラスターでSGEを使用して実行されているレガシー科学コードがいくつかあります。qsubスクリプト(つまり、Sun Grid Engineが取得して実行するスクリプト)を生成するアプリケーション固有のジョブ送信スクリプトがあります。

qsubスクリプト内で、私のレガシーアプリが呼び出されます。このアプリは、その出力をSTDOUTに送信します。SGEはSTDOUTをインターセプトし、ユーザーのホームディレクトリ内のファイルにスプールするため、ユーザーは結果がリアルタイムで蓄積されるのを確認できます。この動作を維持したいのですが、同時に、すべての出力をバックグラウンドで透過的にログに記録したいと思います。ティーはこれを達成するのに最適だと思いました。

そこで、アプリを実行し、STDOUTをteeにパイプするようにジョブ送信スクリプトを変更しました。これにより、ジョブが完了すると中央ストアにコピーされるファイルにSTDOUTが保存されます。アプリは実行され、次のようにteeにパイプされます。

\$GMSCOMMAND | tee \$SCRATCHDIR/gamess_output.log

問題は、コードをteeにパイプし始めてから、特に複数のノードを要求したときに、アプリがSIGTERMで死んでしまうことです。teeで-i(割り込みを無視)パラメーターを使用してみました。違いはありません。

アプリの出力をファイルにリダイレクトし、アプリが完了したらファイルをcatにすると、問題なく動作しますが、ユーザーが結果の蓄積をリアルタイムで表示できるようにすることはできません(これは重要な要件です)。

なぜこのティーの使用が失敗するのかについてのアイデアはありますか?または、代わりに、他にどのようにして目的の機能を実現できるかについてのアイデアはありますか?

4

2 に答える 2

1

あなたの特定のケースが失敗している理由については何も知りませんが、1つのオプション$GMSCOMMANDはそれを独自のロギングにすることかもしれません。(効果的にティーをアプリ内に配置します)。このオプションは、レガシーアプリを変更するコストに依存すると思います。

「レガシーアプリ」を独自のスクリプト/アプリケーションでラップしてリダイレクト/複製を行うことができなかった場合。

于 2009-11-23T11:01:18.650 に答える
0

パイプが問題である場合は、プロセス置換を伴う「while/read」ループを使用することでこれを回避できる可能性があります。これはあなたのために働きますか?

while read line; do
    echo "$line"
    echo "$line" >> ${SCRATCHDIR}/gamess_output.log
done <(${GMSCOMMAND})
于 2009-12-16T11:20:49.877 に答える