psを実行すると競合状態が発生する危険はありますか?

psを実行すると競合状態が発生する危険はありますか?

長期実行プロセス(Javaで時々関連する)を起動し、デフォルトpsで次のことを試みます。

Process longRunningProcess = new ProcessBuilder(...).start();

Process psProcess = new ProcessBuilder("ps").start();
psProcess.waitFor();
// extract the PID from the output of psProcess

またはBashでも同様です。

$ long_running_process > /dev/null & ps

問題は、長期実行プロセスがpsまだ報告されていないまだ開始中の状態にある可能性があることです。それとも、実行時にps長期実行プロセスが目に見えるほどに開始されるという保証はありますか?コマンドを繰り返し実行現れるプロセスは常に含まれますが、これは明らかに何も証明しません。

この記事実行されたコマンドに対して可能な競合状態に関する警告後ろに psが開始されたが(たとえばps | grep)、以前に開始されたプロセスについては何も言及しませんps

ベストアンサー1

OpenJDKと同じタスクの場合v6-b14、PID〜するps仮想ファイルシステムをスキャンするときに使用できます/proc。プロセスが実際に開始されたか(つまり、何も完了したかどうか)はっきりわかる方法はありません。 PIDが予約されて予約されただけです。死んだそしてゾンビの状態)。

ただし、psUnixシステムにロックされているため、Reflectionを使用してProcessBuilderから返されたオブジェクトを調べることができます。これはUnixProcessに接続します。

final class  [More ...] UNIXProcess extends Process {
    private FileDescriptor stdin_fd;
    private FileDescriptor stdout_fd;
    private FileDescriptor stderr_fd;
    private int pid; <----------------------------------------------
    private int exitcode;

もちろんはいハッキングですが、生成と大きく変わらず、間違いなくps高速です。それほど危険ではありません。pid「Change Soon」というpidフィールドは表示されません。

おすすめ記事