제가 사용하고 있는 타사 도구에 스레드 "누출"을 일으키는 알려진 버그가 있는 것 같습니다. 스레드에 다른 프로그램과의 통신 문제가 있고 해당 스레드가 정리되지 않은 경우 스레드는 결국 좀비 상태가 됩니다.
이런 일은 통신 문제가 있을 때만 발생하기 때문에 스레드가 쌓이는 데 얼마나 오래 걸릴지 알 수 없으며, 쌓이지 않고 몇 달 동안 갈 수도 있고, 아니면 한계점까지 갈 수도 있습니다. 한시간. 통신 문제에 대한 최악의 시나리오.
스레드가 쌓이는 것을 방지하기 위해 내가 할 수 있는 일은 많지 않습니다. 해결 방법으로 스레드 수가 ulimit 값에 가까워지면 응용 프로그램을 자동으로 다시 시작하도록 프로그램을 구성하고 싶습니다. 이 작업을 수행하는 가장 좋은 방법이 무엇인지 궁금합니다.
매시간 실행되는 크론 작업을 작성하고 프로세스 상태를 확인한 후 다시 시작할 수 있습니다. 크론 작업 접근 방식처럼 한도에 도달한 후 59분이 걸리는 최악의 경우보다는 ulimit에 도달한 후 즉시 다시 시작하는 것이 바람직합니까? 더 쉬운 방법이 있습니까?
답변1
이를 수행하려면 crontab 유틸리티를 사용할 수 있습니다.
파일을 만들고 그 안에 스크립트를 넣으세요. 모니터링하려는 프로그램의 이름을 변경하십시오.
이름을 script.sh로 가정하고 파일을 저장합니다.
#!/bin/sh
MAX_THREADS=60
PROGRAM_NAME="firefox"
PID=$(ps -A | grep $PROGRAM_NAME | sed 's/\([0-9]*\).*/\1/')
CUR_NO_THREADS=$(cat /proc/"$PID"/status | grep Threads | tr -dc '0-9');
if [ "CUR_NO_THREADS" -ge "$MAX_THREADS" ];
then
killall $PROGRAM_NAME;
$PROGRAM_NAME;
fi;
이제 crontab을 다음과 같이 실행하십시오.
sudo crontab -e
그러면 vim이나 nano에서 파일이 열리고 해당 파일에 저장됩니다.
0 * * * * /path/to/script/script.sh