보류 중인 신호를 소비하는 프로세스를 확인하는 방법은 무엇입니까?

보류 중인 신호를 소비하는 프로세스를 확인하는 방법은 무엇입니까?

사용자가 특정 프로그램을 실행하려고 하면 다음 메시지가 나타납니다.

timer_create: 리소스를 일시적으로 사용할 수 없습니다.

StackOverflow의 Q&A 제목은 다음과 같습니다.timer_create(): -1 EAGAIN(리소스를 일시적으로 사용할 수 없음), 이것이 신호를 처리할 공간 부족과 관련이 있다는 것을 발견했습니다. 다음 명령을 실행하여 별도의 사용자 계정을 사용하여 이를 확인했습니다.

$ ulimit -i 0

같은 오류가 발생하는지 확인했는데 실제로 그랬습니다. 다음 명령을 사용하십시오.

$ ulimit -i 1

또는 오류 없이 더 높은 금액.

원래 사용자가 실행했을 때 ulimit -i127368을 얻었습니다. 그래서 나는 보류 중인 신호를 위한 공간이 부족하다고 결론지었습니다.

무슨 일이야? 이것은 하나 이상의 실행 중인 프로그램이 이를 소비했다는 것을 의미합니까? 그렇다면 어떤 것을 어떻게 알 수 있습니까?

답변1

글쎄, 그건 아니야아름다운해결책이지만 적어도 그럴 수도 있습니다.해결책.

/proc/[pid]/statusSigPnd 및 ShdPnd에 대한 항목이 있습니다 . 그들은 다음과 같이 설명됩니다.

SigPnd, ShdPnd: 스레드 및 전체 프로세스에 대해 보류 중인 신호 수입니다(pthreads(7) 및 signal(7) 참조).

그리고 SigQ는,

SigQ: 이 필드에는 프로세스의 실제 사용자 ID의 대기 중인 세마포어와 관련된 두 개의 슬래시로 구분된 숫자가 포함되어 있습니다. 첫 번째는 이 실제 사용자 ID에 대해 현재 대기 중인 신호 수이고, 두 번째는 이 프로세스에 대해 대기 중인 신호 수에 대한 자원 제한입니다(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"

관련 정보