주어진 프로세스에 대해 5 분 이상 실행 된 프로세스를 종료하려면 명령이 필요합니다.
5 분마다 그 명령을 실행해야합니다.
대단히 감사합니다 !
(시스템은 Centos5입니다)
주어진 프로세스에 대해 5 분 이상 실행 된 프로세스를 종료하려면 명령이 필요합니다.
5 분마다 그 명령을 실행해야합니다.
대단히 감사합니다 !
(시스템은 Centos5입니다)
답변:
kill -9 $(ps -eo comm,pid,etimes | awk '/^procname/ {if ($3 > 300) { print $2}}')
여기서 "procname"은 프로세스 이름이고 300은 실행 시간 임계 값입니다.
$(ps -eo comm,pid,etimes | awk '/^procname/ {if ($3 > 300) { print "kill "$2}}')
약간의 부드러운하지만 대답은 큰 어쨌든
이전 버전의 두 가지 답변을 모두 활용하는 내 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별로 프로세스를 필터링하고 실행 시간이 제한을 초과하면 프로세스를 종료하고 전자 메일로 보고서를 보냅니다. 해당 이메일이 필요하지 않은 경우 마지막 행에 댓글을 달 수 있습니다.
이 페이지에서 해결책을 찾았습니다 : 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
kill -9
프로세스가 종료하기 전에 정상적으로 정리할 수있는 기회를 제공하지 않으므로 사용해서는 안됩니다 .
여기 에 원하는 것을 수행하도록 수정할 수 있는 스크립트가 있습니다 .
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
etimes
of 열 을 사용할 수 있습니다 ps
(시작 시간부터 계산할 필요 없음).
ps
있는 시스템에서는 etimes
(만 etime
)을 지원하지 않는 경우 이는 훌륭한 대안입니다. 난 그냥 최고 답변이 나에게 오류를 줬을 때 그것을 사용ps
비슷한 작업을 해결해야했으며 스크립트가 필요하지 않습니다. "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
-9
내 프로세스에 조금 친숙 하지 않고 그것을 사용했으며grep -v defunct |
이전 에 awk 명령이 유효한 PID를 반환하지 못하게하는 출력을awk
볼 수있는 것처럼 이전 을 추가했습니다procname <defunct>
. 그리고 이것은 kill 명령을 깨뜨릴 것입니다.