Linux bash 스크립트에서 지정된 사용자가 5 분 이상 실행중인 모든 프로세스를 종료하십시오.


18

주어진 프로세스에 대해 5 분 이상 실행 된 프로세스를 종료하려면 명령이 필요합니다.

5 분마다 그 명령을 실행해야합니다.

대단히 감사합니다 !

(시스템은 Centos5입니다)

linux  bash 

답변:


17
kill -9 $(ps -eo comm,pid,etimes | awk '/^procname/ {if ($3 > 300) { print $2}}')

여기서 "procname"은 프로세스 이름이고 300은 실행 시간 임계 값입니다.


위대한 oneliner. 나는 -9내 프로세스에 조금 친숙 하지 않고 그것을 사용했으며 grep -v defunct |이전 에 awk 명령이 유효한 PID를 반환하지 못하게하는 출력을 awk볼 수있는 것처럼 이전 을 추가했습니다 procname <defunct>. 그리고 이것은 kill 명령을 깨뜨릴 것입니다.
Michael Härtl

말을 나는 $(ps -eo comm,pid,etimes | awk '/^procname/ {if ($3 > 300) { print "kill "$2}}')약간의 부드러운하지만 대답은 큰 어쨌든
Yevgen

@WhiteHat 어떻게 똑같은 일을하지만 특정 pid를 가진 프로세스를 위해?
Petar Vasilev

내 시간을 낭비 한 가지는 : 'awk NOT "와 함께 사용해야합니다
cn123h

6

아마도 crontab에서 이와 같은 장기 실행 명령을 실행할 수 있습니까?

timeout -k 300 command

5

이전 버전의 두 가지 답변을 모두 활용하는 내 kill 스크립트 버전 :

#!/bin/bash

#Email to send report
MY_EMAIL="example@email.com"

#Process name to kill
NAME_KILL="php"

#UID to kill
UID_KILL=33.

#Time in seconds which the process is allowed to run
KILL_TIME=60

KILL_LIST=()
EMAIL_LIST=()
while read PROC_UID PROC_PID PROC_ETIMES PROC_ETIME PROC_COMM PROC_ARGS; do
    if [ $PROC_UID -eq $UID_KILL -a "$PROC_COMM" == "$NAME_KILL" -a $PROC_ETIMES -gt $KILL_TIME ]; then
    KILL_LIST+=("$PROC_PID");
    MSG="Killing '$PROC_ARGS' which runs for $PROC_ETIME";
    EMAIL_LIST+=("$MSG");
    echo "$MSG";
    fi
done < <(ps eaxo uid,pid,etimes,etime,comm,args | tail -n+2)
if [ ${#KILL_LIST[*]} -gt 0 ]; then
    kill -9 ${KILL_LIST[@]}
    printf '%s\n' "${EMAIL_LIST[@]}" | mail -s "Long running processes killed" $MY_EMAIL
fi

UID, NAME별로 프로세스를 필터링하고 실행 시간이 제한을 초과하면 프로세스를 종료하고 전자 메일로 보고서를 보냅니다. 해당 이메일이 필요하지 않은 경우 마지막 행에 댓글을 달 수 있습니다.


2

이 페이지에서 해결책을 찾았습니다 : http://www.directadmin.com/forum/showthread.php?t=26179

빈 파일을 만들고 killlongproc.sh라고 부릅니다.

이것을 복사하십시오 :

#!/bin/bash
# This script will kill process which running more than X hours
# egrep: the selected process; grep: hours
PIDS="`ps eaxo bsdtime,pid,comm | egrep "spamd|exim|mysqld|httpd" | grep " 1:" | awk '{print $2}'`"

# Kill the process
echo "Killing spamd, exim, mysqld and httpd processes running more than one hour..."
for i in ${PIDS}; do { echo "Killing $i"; kill -9 $i; }; done;

당신의 cronjob에서 이것을 중지

15 * * * * * root /{directory}/./killongproc.sh

4
이 작업을 수행하는 것은 일반적으로 나쁜 생각입니다. 실제로 어떤 문제를 해결하려고합니까? 또한 kill -9프로세스가 종료하기 전에 정상적으로 정리할 수있는 기회를 제공하지 않으므로 사용해서는 안됩니다 .
추후 공지가있을 때까지 일시 중지되었습니다.

1
이렇게하면 일정 시간 동안 실행되는 프로세스 (예 : 1 시간 전에 시작된 프로세스)가 아니라 일정량의 CPU 시간 (사용자 + 시스템)을 소비 한 프로세스가 종료됩니다.
Marki555

2

여기 에 원하는 것을 수행하도록 수정할 수 있는 스크립트가 있습니다 .

EDIT 아래 스크립트를 추가했습니다

#!/bin/bash
#
#Put the UID to kill on the next line
UID_KILL=1001

#Put the time in seconds which the process is allowed to run below
KILL_TIME=300

KILL_LIST=`{
ps -eo uid,pid,lstart | tail -n+2 |
    while read PROC_UID PROC_PID PROC_LSTART; do
        SECONDS=$[$(date +%s) - $(date -d"$PROC_LSTART" +%s)]
        if [ $PROC_UID -eq $UID_KILL -a $SECONDS -gt $KILL_TIME ]; then
        echo -n "$PROC_PID "
        fi
     done 
}`

if [[ -n $KILL_LIST ]]
then
        kill $KILL_LIST
fi

나는 그것을 수정할 충분한 지식이 없다. 그것이 내가 당신에게 묻는 이유이다

2
너무 복잡한. 프로세스 시작 이후 경과 된 초를 직접 표시하기 위해 etimesof 열 을 사용할 수 있습니다 ps(시작 시간부터 계산할 필요 없음).
Marki555

@ Marki555 네 맞습니다. 그러나 버전이 ps있는 시스템에서는 etimes(만 etime)을 지원하지 않는 경우 이는 훌륭한 대안입니다. 난 그냥 최고 답변이 나에게 오류를 줬을 때 그것을 사용ps
마이크

0

비슷한 작업을 해결해야했으며 스크립트가 필요하지 않습니다. "THECOMMAND"실행 파일의 프로세스 종료 (신호 SIGTERM) :

killall -u $USER --older-than 5m THECOMMAND

-u $USER다른 사용자도 "THECOMMAND"를 실행하는 경우 불필요한 오류 메시지를 피하기 위해 현재 사용자 로 제한 해야합니다. 자신의 사용자 crontab에서 다음을 입력하십시오.

*/5 * * * *     killall -u $USER --older-than 5m THECOMMAND

시스템 crontab (사용자 'root')에서 다음을 추가합니다.

*/5 * * * *     killall --older-than 5m THECOMMAND

프로세스를 종료하지 않고 종료 (SIGKILL)하려면 (SIGTERM) --signal SIGKILL, 매개 변수 에 추가하여 SIGKILL 신호를 명시 적으로 보내십시오 . 시스템 crontab의 예 :

*/5 * * * *     killall --older-than 5m --signal SIGKILL THECOMMAND

-4

httpd

ps eaxo pid, 시간, 통신 | 꼬리 -n + 2 | grep 'httpd'| awk 'substr ($ 0,9,1)> 0'| awk '{print $ 1}'

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