최대 스레드 한계에 도달하면 프로그램을 자동으로 다시 시작하는 방법은 무엇입니까?

최대 스레드 한계에 도달하면 프로그램을 자동으로 다시 시작하는 방법은 무엇입니까?

제가 사용하고 있는 타사 도구에 스레드 "누출"을 일으키는 알려진 버그가 있는 것 같습니다. 스레드에 다른 프로그램과의 통신 문제가 있고 해당 스레드가 정리되지 않은 경우 스레드는 결국 좀비 상태가 됩니다.

이런 일은 통신 문제가 있을 때만 발생하기 때문에 스레드가 쌓이는 데 얼마나 오래 걸릴지 알 수 없으며, 쌓이지 않고 몇 달 동안 갈 수도 있고, 아니면 한계점까지 갈 수도 있습니다. 한시간. 통신 문제에 대한 최악의 시나리오.

스레드가 쌓이는 것을 방지하기 위해 내가 할 수 있는 일은 많지 않습니다. 해결 방법으로 스레드 수가 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

관련 정보