これを知ることは可能ですか?この情報を見つけるには一種のテストを実行する必要がありますか?
ログインした後、私のシステムはmax_pidをラップしているようで、まだ生きているシステムは以前のプロセスと同じpidを取得しました(これは私のスクリプトの1つがめちゃくちゃになりました...)!何が起こっているのか、解決策があるのか理解しようとしています。
私は/proc/sys/kernel/pid_max
32768です
答え1
pid_max
どのくらいの改行が発生したかを知る方法はありません。ラッパーの発生を防ぐpid_max
1つの解決策は、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の回答の引用を参照)。