사용자가 특정 프로그램을 실행하려고 하면 다음 메시지가 나타납니다.
timer_create: 리소스를 일시적으로 사용할 수 없습니다.
StackOverflow의 Q&A 제목은 다음과 같습니다.timer_create(): -1 EAGAIN(리소스를 일시적으로 사용할 수 없음), 이것이 신호를 처리할 공간 부족과 관련이 있다는 것을 발견했습니다. 다음 명령을 실행하여 별도의 사용자 계정을 사용하여 이를 확인했습니다.
$ ulimit -i 0
같은 오류가 발생하는지 확인했는데 실제로 그랬습니다. 다음 명령을 사용하십시오.
$ ulimit -i 1
또는 오류 없이 더 높은 금액.
원래 사용자가 실행했을 때 ulimit -i
127368을 얻었습니다. 그래서 나는 보류 중인 신호를 위한 공간이 부족하다고 결론지었습니다.
무슨 일이야? 이것은 하나 이상의 실행 중인 프로그램이 이를 소비했다는 것을 의미합니까? 그렇다면 어떤 것을 어떻게 알 수 있습니까?
답변1
글쎄, 그건 아니야아름다운해결책이지만 적어도 그럴 수도 있습니다.ㅏ해결책.
/proc/[pid]/status
SigPnd 및 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"