0

ファイルAを書き込むプログラムを呼び出すkシェルを実行するJavaスクリプトがあります。その後、同じJavaスクリプトが出力ファイルAを解析します。他のプロセスはファイルAを読み書きしません。

問題は、ファイル A が時間内に解析される準備が常に整っているとは限らないことです。これは、プログラムと呼び出し元のシェルが戻った後でも、ファイル システムがまだジョブを終了しているためだと思います。これは、多数のプロセスが実行されている場合にのみ発生します。

私のシステムでは lsof が動作しないようです。エディターでファイルを開くと、lsof はエディター プロセスを表示しますが、ファイル名を lsof に渡すと、次のようになります: lsof: no file use located: filename

プログラムまたはkシェルから戻る前にロックを解除する必要があるため、ファイルが完全に閉じられていない可能性があるため、fileLockは機能しないと思います。

私の考えでは、ファイルの名前を変更 (mv) し、パーサーに名前を変更したファイルを解析させる短いスクリプトを作成することでした。私の理解では、ファイルは完全に書き込まれるまで名前を変更できないということです。mv コマンドからの stdOut に何かが含まれているかどうかを確認する while ループに mv コマンドを入れました。理論的には、それが空であれば問題ありません。

#! /bin/ksh
# Move a file. The idea is that this script will not return until the mv is
# complete. If mv is successful, mv.out.txt should be empty.

mv $1/camber.out $1/camber.out.copy > mv.out.txt
while [[ -s mv.out.txt ]] ; 
do
    echo "mv did not happen"
    mv $1/camber.out $1/camber.out.rename > mv.out.txt
done
echo "mv should have taken place"

exit

mv が停止された例はまだ見たことがありません。コメント、提案、ヒント、または侮辱は大歓迎です。すべてに前もって感謝します。

4

1 に答える 1

2

コメントする能力がないので、これが答えになります。とにかく、非同期実行の問題のように聞こえます.Javaプログラムはbashスクリプトを呼び出します.bashスクリプトはOSによって別のプログラムとして処理されるため、Javaプログラムと同時に実行されます。すべてを正しく実行するには、bash スクリプトが同期的に実行されていることを確認する必要があります。つまり、Java が続行する前にスクリプトが終了する必要があります。ブロッキングに関連するこのSOの回答は、必要なことを行うはずだと思います。解決策は次のとおりです。

ProcessBuilder pb = new ProcessBuilder("myscript.sh");
Process p = pb.start();     // Start the process.
p.waitFor();                // Wait for the process to finish.
System.out.println("Script executed successfully");

これにより、bash スクリプトが終了するまで Java プログラムが強制的にスリープ状態になります。

以下のコメントで指摘したように、同じロジックをkシェルに適用する必要があるかもしれません。オプションのパラメーターとしてジョブを受け取るコマンドを使用しwaitて、プロセスを待機できます (特定のジョブを渡さない場合、プロセスはすべての子プロセスが終了するまで待機します)。

于 2015-05-27T06:19:19.893 に答える