保留中の信号を消費するプロセスを確認するには?

保留中の信号を消費するプロセスを確認するには?

ユーザーが特定のプログラムを実行しようとすると、次のメッセージが表示されます。

timer_create: リソースを一時的に使用できません。

StackOverflowのQ&Aタイトルは次のとおりです。timer_create(): -1 EAGAIN (リソースを一時的に使用できません)、これが信号を処理するスペース不足に関連していることがわかりました。次のコマンドを実行して、別のユーザーアカウントを使用してこれを確認しました。

$ ulimit -i 0

同じエラーが発生したかどうかを確認しましたが、実際にそうしました。次のコマンドを使用します。

$ ulimit -i 1

またはエラーなしでより高い金額。

元のユーザーが実行したときにulimit -i127368を取得しました。それで、私は保留中の信号のためのスペースが足りないと結論付けました。

どうしたの?これは、1つ以上の実行中のプログラムがそれを消費したことを意味しますか?それでは、どのようなことをどのように知ることができますか?

答え1

まあ、そうではありません。美しい解決策ですが、少なくともそうかもしれません。解決策。

/proc/[pid]/statusSigPndとShdPndのエントリがあります。彼らは次のように説明されています。

SigPnd、ShdPnd:スレッドとプロセス全体で保留中のシグナルの数(pthreads(7)とsignal(7)を参照)。

そしてSigQは、

SigQ:このフィールドには、プロセスの実際のユーザーIDの待機中のセマフォに関連する2つのスラッシュで区切られた番号が含まれています。 1つ目はこの実際のユーザーIDに対して現在待機しているシグナルの数、2つ目はこのプロセスで待機しているシグナル数のリソース制限です(getrlimit(2)のRLIMIT_SIGPENDINGの説明を参照)。

(すべてから由来man 5 proc)。

そのため、すべてのpidを検索し/proc、そのファイルを確認し、status保留中のシグナルを含むpidを見つけることができます。

この試み、

cd /proc

find . -name "status" | xargs grep SigPnd 2> /dev/null | grep -v "0000000000000000"

そして

find . -name "status" | xargs grep ShdPnd 2> /dev/null | grep -v "0000000000000000"

関連情報