![在 Linux Bash 脚本中终止特定用户运行超过 5 分钟的所有进程](https://linux22.com/image/520520/%E5%9C%A8%20Linux%20Bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E7%BB%88%E6%AD%A2%E7%89%B9%E5%AE%9A%E7%94%A8%E6%88%B7%E8%BF%90%E8%A1%8C%E8%B6%85%E8%BF%87%205%20%E5%88%86%E9%92%9F%E7%9A%84%E6%89%80%E6%9C%89%E8%BF%9B%E7%A8%8B.png)
我需要命令来终止某个给定进程已经运行至少 5 分钟的进程。
我必须每五分钟左右运行一次该命令。
太感谢了 !
(系统是Centos5)
答案1
kill -9 $(ps -eo comm,pid,etimes | awk '/^procname/ {if ($3 > 300) { print $2}}')
其中“procname”是进程名称,300 是运行时间阈值
答案2
也许在 crontab 中运行像这样的长时间运行的命令?
timeout -k 300 command
答案3
我的终止脚本版本借鉴了前面两个答案的优点:
#!/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 过滤进程,如果执行时间超过限制 - 则终止进程并发送报告到电子邮件。如果您不需要该电子邮件 - 您只需注释最后一行即可。
答案4
有一个脚本这里你可以修改它来做你想做的事情。
编辑添加了下面的脚本
#!/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