
それを知ることはそもそも可能なのでしょうか? その情報を見つけるには、何らかのテストを実行する必要があるのでしょうか?
私のシステムは、ログイン直後に既に max_pid をラップしているようで、まだ生きている pid が古いプロセスと同じ pid を取得しました (スクリプトの 1 つが台無しになっています...)。何が起こっているのか、また、それに対する回避策があるのかどうかを理解したいと思っています...
私のは/proc/sys/kernel/pid_max
32768です
答え1
ラップが何回発生したかは分かりませんpid_max
。ラップが発生しないようにするための回避策の1つは、内部の値pid_max
を増やすことです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が不足していることが分かるのは、次のようなエラーが発生したときだけです。コメント言う、
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 が古いプロセスと同じ pid を取得しました (私のスクリプトの 1 つが混乱しています...)
スクリプトが台無しになるのはなぜですか? プロセスの PID をファイルに書き込んでいるが、後でそのプロセスが完了し、他のスクリプトが「間違った」 PID を参照していることが判明したためでしょうか?
さらに、すべての PID 番号は一意です (Ramesh の回答の引用を参照)。