KILL 프로세스, 프로세스 이름과 시간을 입력하세요.

KILL 프로세스, 프로세스 이름과 시간을 입력하세요.

지정된 시간 이상 실행되는 경우 지정된 프로세스를 종료하고 종료하기 전에 프로세스 정보를 가져오는 쉘 스크립트를 작성하려고 합니다.

참고: 스크립트는 프로세스 이름과 시간을 입력으로 사용해야 합니다. 지금까지 시도한 것은 다음과 같습니다.

#!/bin/sh
ps -eaf |
awk '{print $7, $8}' |
sort -n |
grep -v TIME |
grep -v 00:00:00 |
awk -F ":" '{if ( $2 >= 01 ) print}'

o/p는 다음과 같이 인쇄합니다.

00:08:15 /usr/bin/dockerd
00:17:41 /usr/bin/kubelet

여기서 막히게 됩니다... 01분보다 오래된 프로세스를 종료해야 하므로 스크립트 입력을 프로세스 이름과 시간으로 사용하여 위 프로세스를 종료해야 합니다.

답변1

IMHO 당신은 막다른 골목에 이르렀고 이런 식으로 하고 싶은 일을 할 수 없습니다.

문제는 스크립트가 실행되는 동안 TIME프로세스 속성이 변경되었을 수 있으므로 정보가 최신이 아니라는 것입니다. TIME부부는 TIME과정 CMD을 확인할 수 없습니다.

왜이 짓을 했나요 awk '{print $7, $8}'? 이 시점에서는 프로세스를 식별하기 CMD위해 필요하지 않으므로 로 변경하면 됩니다 .PIDawk '{print $7, $2}'

PID검색 중인 프로세스에 대한 s를 인쇄하려면 다음과 같이 코드를 변경할 수 있습니다 .

ps -eaf \
| awk '{print $7, $2}' \
| sort -n \
| grep -v TIME \
| grep -v 00:00:00 \
| awk -F ":" '{if ( $2 >= 01 ) print}' \
| awk '{print $2}'

또한 코드에 미묘한 오류가 있습니다. 04:00:23프로세스에 다음과 같은 오류가 있으면 어떻게 될까요 TIME? 귀하의 코드는 확인만 하기 때문에 건너뜁니다.필드가 존재합니다 TIME. 다음과 같이 수정할 수 있습니다.

ps -eaf \
| awk '{print $7, $2}' \
| sort -n \
| grep -v TIME \
| grep -v 00:00:00 \
| awk -F ":" '{if (( $1 >= 01 ) || ( $2 >= 01 )) print}' \
| awk '{print $2}'

기술 향상을 위한 몇 가지 팁:

  • -o옵션 ps-F옵션, 그리고 awk열의 의미를 확인해야 합니다 .TIMEps
  • 다음 코드 줄이 어떻게 작동하는지 이해해 보세요.

    ps -eo time,pid --no-headers | awk -F '[ :]*' '$1>0 || $2>0 {print $4}' | xargs kill
    

답변2

다음을 사용하여 pid 및 명령과 함께 CPU 시간을 초 단위로 얻을 수 있습니다.

ps -Ao time= -o pid= -o comm= |
  perl -lpe 's/^(\d+-)?(\d\d):(\d\d):(\d\d)/(($1*24+$2)*60+$3)*60+$4/e'

perl다음 명령을 사용하여 종료할 수도 있습니다.

ps -Ao time= -o pid= -o comm= |
  perl -lne '
    if (/^(\d+-)?(\d\d):(\d\d):(\d\d)\s+(\d+)\s+(.*)/) {
      $cputime = (($1*24+$2)*60+$3)*60+$4;
      $pid = $5;
      $comm = $6;
      if ($cputime > 60) {
        print "$pid ($comm) has used $cputime seconds of CPU, killing it";
        kill "TERM", $pid or warn "kill($pid): $!\n";
      }
    }'

관련 정보