오래된 프로세스를 찾아서 죽입니다.


10

기본적으로 프로세스 트리를 스캔하고 특정 이름과 일치하고 일주일 이상 실행을 시작한 프로세스를 찾을 수 있어야합니다. 일단 가지고 나면 죽여야 해요 모든 프로세스는 여전히 시스템 시간을 사용하지 않고 시스템에 의해 실행중인 상태로 보입니다. 그들은 보통이 상태에서도 영원히 앉아있을 것입니다.

이상적으로는 찾아야하지만 프로세스와 비슷한 것을 원합니다.

시스템은 데비안 리눅스이며 크론에 의해 스크립팅되고 실행될 것이므로 크지 만 이해할 수있는 문제는 없습니다.


4
오래되었지만 중요한 프로세스와 죽이는 프로세스를 어떻게 차별화 할 계획입니까?
Chopper3

답변:


9

당신은 ps, awk 및 kill의 조합으로 이것을 할 수 있습니다 :

ps -eo pid,etime,comm

프로세스 PID, 프로세스 시작 이후의 경과 시간 및 인수없이 명령 이름을 사용하여 3 개의 열 출력을 제공합니다. 경과 시간은 다음 중 하나와 같습니다.

mm:ss
hh:mm:ss
d-hh:mm:ss

일주일 이상 실행 된 프로세스를 원하므로 해당 세 번째 패턴과 일치하는 행을 찾으십시오. awk를 사용하여 다음과 같이 시간과 명령 이름으로 프로세스를 필터링 할 수 있습니다.

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }'

7 일 이상 실행 된 'mycommand'와 일치하는 모든 명령의 pid를 인쇄합니다. 이 목록을 강제 종료하면 완료됩니다.

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' | kill -9

좋은 감사합니다. ps의 형식 지정 옵션을 완전히 잊어 버렸습니다.
Ryaner

2
"7 일 이상"실행중인 프로세스는 표시하지 않습니다. 7 일에서 8 일 미만으로 실행중인 프로세스를 보여줍니다.
hobodave

etimes더 편리합니다 — serverfault.com/a/393476/67675
poige

4

killall --quiet --older-than 1w process_name


1
이것은 Ubuntu 16.04에서 훌륭하게 작동하며 -i (interactive) 플래그와 함께 사용하여 생각 해야하는 프로세스를 테스트하고 대상인지 확인할 수 있습니다.
ezwrighter

1

필요한 모든 정보는에서 얻을 수 있습니다 ps -ef. "STIME"열을 참조하십시오. 이를 결합하여 grep필요한 프로세스를 정렬하십시오. 이 시점에서 cut모든 일치하는 프로세스의 pid를 잡고에 전달할 수 kill있습니다.

이 작업을 수행하는 방법에 대한 자세한 내용을 알려면 알려주십시오.


자세한 내용을 부탁합니다. 다른 답변은 간단하지 않습니다.
hobodave

1

루트 인 경우 휴지통을 제거하려면 (/ proc / fs proc / stat ...)

find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \;

0

프로세스가 시작되면 / proc 파일 시스템에 디렉토리가 생성됩니다. find 명령을 사용하여 7 일보다 오래된 디렉토리를 가져오고 다음과 같이 프로세스를 종료 할 수 있습니다.

find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9 

이것은 작동하지 않습니다. 이 경고는 그대로 발생하고 추가 출력은 발생하지 않습니다. find: warning: you have specified the -maxdepth option after a non-option argument -user, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.-maxdepth를 첫 번째 출력으로 이동하면 프로세스가 리턴되지 않으며 많은 수의 일치해야합니다.
hobodave

또한 디렉토리의 생성 날짜를 찾고 있다면 mtime이 ctime이 아닌 이유는 무엇입니까? 추가 자녀가 생성 된 경우 디렉토리가 이론적으로 내가 배제하지 것이다 (아마도 새로로드 된 커널 모듈이 어떤 방법으로 sysfs를 확장 것)하는 수정할 수 있습니다
jmtd

0

아무도 ps-watcher를 언급하지 않았습니다 . elapsed2sec 함수를 사용하여 $ start_time을 비교할 수 있다고 생각하지만 확실하지는 않습니다. 내 첫 생각은 다음과 같습니다.

[myproc]
occurs = every
trigger = elapsed2secs('$start_time') > 7*DAYS
action = <<EOT
  echo "$command has been running more than 7 days" | /bin/mail user\@host
  kill -TERM $pid
EOT

그것이 효과가 있는지는 모르지만 좋은 출발점이되어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.