메모리나 CPU를 많이 사용하는 Linux/Unix 서버에서 일종의 타임아웃 프로그램을 만드는 것이 얼마나 어렵습니까? 이를 위해 무엇을 해야 합니까?
이런 일이 자주 발생합니다. 많은 리소스를 사용하여 작업을 수행하는 경우 전체 리소스를 원할 수도 있습니다. 하지만 3일 이상 실행 상태로 놔두면 정말 말도 안 되는 일입니다. 하려는 일을 한 시간 안에 완료할 수 없다면 개인 서버를 사용해야 합니다. 수백명의 사람들이 사용해야 하는 서버인데, 스크린샷에서 볼 수 있듯이 리소스가 제한된 오래된 서버입니다. 한 시간 안에 이를 방지할 수 있는 방법을 생각해 볼 수 있나요? 이 경우 해당 사람은 서버의 99.9%를 사용하고 있는 것입니다.
답변1
이건 어때? 약간의 조정이 필요할 수 있지만 이를 파악하기 위한 출발점으로 사용할 수 있다고 확신합니다. cron에서 실행할 수 있습니다. 어떤 이유로든 작동하지 않는다면 웹사이트의 포맷 오류일 수 있습니다.
#!/bin/bash # 내부 필드 구분 기호 IFS=" " # 설정 minUid=1000 # 종료할 최소 UID(보호 서비스 및 루트) maxCpu=25 # $maxTime 내에 프로세스가 소비할 수 있는 최대 %CPU maxTime=3600 #프로세스가 실행될 수 있는 최대 시간(초) # 프로세스 목록을 로드하고 형식을 지정합니다. psList=$(ps -eo pid,uid,pcpu,etimes,args | awk '{ print $1" "$2" "$3" "$4" "$5}' | tail -n+2) 에코를 기다려주세요... # 각 프로세스에 대해 이 작업을 수행합니다. $psList의 프로세스에 대해 다음을 수행합니다. pid=$(echo $process | cut -d' ' -f1) #pid uid=$(echo $process | cut -d' ' -f2) #uid cpu=$(echo $process | cut -d' ' -f3) #cpu 사용량 cpu=$(printf "%.0f" $cpu) # 부동 소수점 수를 정수로 변환 etimes=$(echo $process | cut -d' ' -f4) #pid가 시작된 이후 경과된 시간 cmd=$(echo $process | cut -d' ' -f5) #명령 이름 # UID를 죽일 수 있는지 확인 if [ $pid -ge $minUid ]; # 시간 + CPU 사용량 제한을 충족하는지 확인 if [ $etimes -ge $maxTime ] && [ $cpu -ge $maxCpu ] then { # 종료할 프로세스를 결정합니다. echo "kill pid=$pid uid=$uid cpu=$cpu etimes=$etimes cmd=$cmd" KILL -KILL $pid }fi }fi } 완전한