지정된 시간 이상 실행되는 경우 지정된 프로세스를 종료하고 종료하기 전에 프로세스 정보를 가져오는 쉘 스크립트를 작성하려고 합니다.
참고: 스크립트는 프로세스 이름과 시간을 입력으로 사용해야 합니다. 지금까지 시도한 것은 다음과 같습니다.
#!/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
위해 필요하지 않으므로 로 변경하면 됩니다 .PID
awk '{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
열의 의미를 확인해야 합니다 .TIME
ps
다음 코드 줄이 어떻게 작동하는지 이해해 보세요.
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";
}
}'