我需要这个命令来杀死一个给定进程至less5分钟以来运行的进程。
我将不得不每五分钟左右运行一次这个命令。
太感谢了 !
(系统是Centos5)
kill -9 $(ps -eo comm,pid,etimes | awk '/^procname/ {if ($3 > 300) { print $2}}')
其中“procname”是进程名称,300是运行时间阈值
也许在crontab中运行这样的长时间运行命令?
timeout -k 300 command
我在此页面上find了解决scheme: http : //www.directadmin.com/forum/showthread.php?t=26179
创build一个空文件并将其称为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
这里有一个脚本,你可以修改,以做你想做的。
编辑添加了下面的脚本
#!/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
我的杀死脚本的版本,从以前的答案中受益:
#!/bin/bash #Email to send report MY_EMAIL="[email protected]" #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过滤进程,如果执行时间超过限制 – 杀死进程并向电子邮件发送报告。 如果你不需要这封电子邮件 – 你可以只留言最后一行。
我不得不解决一个类似的任务,而且不需要脚本。 对于可执行“THECOMMAND”的终止(信号SIGTERM)过程:
killall -u $USER --older-than 5m THECOMMAND
当前用户-u $USER的限制只有在其他用户也运行“THECOMMAND”时才能避免不必要的错误消息。 在你自己的用户crontab中,你可以input以下内容:
*/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