pid_maxが何回ラップされたかを確認するには?

pid_maxが何回ラップされたかを確認するには?

これを知ることは可能ですか?この情報を見つけるには一種のテストを実行する必要がありますか?

ログインした後、私のシステムはmax_pidをラップしているようで、まだ生きているシステムは以前のプロセスと同じpidを取得しました(これは私のスクリプトの1つがめちゃくちゃになりました...)!何が起こっているのか、解決策があるのか​​理解しようとしています。

私は/proc/sys/kernel/pid_max32768です

答え1

pid_maxどのくらいの改行が発生したかを知る方法はありません。ラッパーの発生を防ぐpid_max1つの解決策は、pid_max内部に価値を追加することです。

cat /proc/sys/kernel/pid_max

上記のコマンドは、システムで使用できるプロセスの最大数を示します。次のようにmax_pid値を増やすことができます。

echo 4194303 > /proc/sys/kernel/pid_max

でも、

sysctl -w kernel.pid_max=4194303

ただし、一部のプロセスが現在メモリを使用しているかどうかを調べる必要があります。

実行ps -A中またはps -e現在システムメモリを使用しているプロセスを確認できます。

パッケージを識別できないのはなぜですか?

~からこれ答え、

ほとんどのシステムは、最後に生成されたPIDの数を保持し、1つを追加します(最も高い数字、たとえば65535またはより小さい数字でラップされます - 一般的に、ラップは65000または60000でも発生します)。現在使用中でないことを確認してください(PIDがまだ使用中の場合は重複しているため、PID 1(カーネル)はまだ存在し、「再発行」されません。

他のセキュリティ認識システムでは、ランダムに番号を生成して、まだ使用されていないことを確認します。

いつでもすべてのPID番号が一意であることを保証します。

pid_maxしたがって、到達しても現在使用されていない一部のPIDがまだ残っている可能性があるため、システムで引き続き使用できます。私が知っている限り、次のエラーが発生したときにのみpidが使い果たされたことがわかります。コメント説明する、

プロセス数が> pid_maxの場合、「プロセスがありません...」などのメッセージが表示されます。

答え2

このコードは、おそらくほとんどの一般的なケースで十分正確です。

#!/bin/bash
count=0;pidPrev=0;
while true;do
    echo -n & pidMax=$!;
    if((pidMax<pidPrev));then
        ((count++));
    fi;
    pidPrev=$pidMax;
    echo "$count,$pidMax";
    sleep 1;
done

考えられる欠陥:
pidMaxがpidPrev以上に増加すると失敗します。
睡眠待ち時間が長すぎると失敗する可能性があります。
マシンの起動時に実行する必要があり、停止/再起動はできません。それ以外の場合、カウントは意味を失います。

限界:
このスクリプトはUbuntu 14.04 64ビットで動作しますが、次のように動作します。ラメッシュの答え新しいプロセスに割り当てられたpidがランダムである場合、システムは機能しない可能性があります。

答え3

一つありますか?XYの問題この問題をここで解決する必要がありますか?質問に言及されている

まだ生きているプロセスは以前のプロセスと同じpidを得ました(これは私のスクリプトの1つがめちゃくちゃになりました...)。

スクリプトはどのように混乱しますか?プロセスのPIDをファイルに書きましたが、後でプロセスが完了し、他のスクリプトが「間違った」PIDを参照していることを発見しましたか?

また、すべてのPID番号は一意です(Rameshの回答の引用を参照)。

関連情報