특정 사용자가 X 시간 이상 소비하는 모든 프로세스를 종료하는 방법

특정 사용자가 X 시간 이상 소비하는 모든 프로세스를 종료하는 방법

프로세스를 나열할 때 ps auxf일부 프로세스가 중단되어 수동으로 종료해야 하는 경우가 종종 있습니다. 명령 하나로 이 작업을 어떻게 수행할 수 있나요?

ps 결과 예:

$ ps auxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME     COMMAND
tommass   7971 62.3  1.1 316428 45844 ?        R    Aug08 29133:14  xxxxxxxx
tommass   7978  0.0  2.6 455072 105964 ?       S    Aug08   8:56    xxxxxxxx
tommass   7979  0.0  2.6 454436 105360 ?       S    Aug08   8:57    xxxxxxxx
tommass  15034 67.8  1.1  51828 43760 ?        R    Aug14 26411:38  xxxxxxxx
tommass   7982  0.0  2.6 455012 105904 ?       S    Aug08   8:28    xxxxxxxx
  1. 특정 사용자 "tommass"가 1시간 이상 소요하는 모든 프로세스를 종료하는 방법
  2. STAT "R"을 사용하여 해당 사용자 "tommass"의 모든 프로세스를 종료하는 방법

답변1

이 문제를 해결하는 방법에는 여러 가지가 있습니다.

  1. pam_limits.so를 사용하고 사용자 프로세스에 대한 CPU 시간 제한을 설정하십시오 /etc/secrity/limits.conf. 이로 인해 CPU 시간 할당량을 초과하는 프로세스가 XCPU 신호를 수신하게 되어 XCPU 신호를 구체적으로 차단/무시/처리하지 않으면 종료됩니다.

  2. 사용자동 Nice 데몬( and데비안/우분투 패키지). 너무 많은 CPU 시간을 사용하는 프로세스를 다시 시작하거나 종료합니다.

  3. ps(1)관심 있는 필드(예: CPU 시간, 사용자 이름, pid)만 인쇄하도록 형식 문자열 매개변수로 호출된 스크립트를 해킹한 다음 쉘스크립트를 사용하여 해당 출력(예: )을 처리할 수 있어야 grep -f file-with-one-username-per-line | while read cputime username pid; do [ "$cputime" -gt max-cpu-time ] && kill -9 $pid; done하지만 이는 재발명입니다. 자동 나이스 데몬.

답변2

1)에 답하려면 먼저

ps -u tomass -o pid,time 

(상황에 따라 시간(CPU 시간), etime(경과 시간)을 선택하실 수 있습니다.)

답변 2) 시도해 보세요

ps -u tomass -o state,pid | awk '$1 == "R" { printf "kill %d\n",$2 ;}' | ksh

실행 중인 프로세스를 정말로 종료하시겠습니까?

관련 정보