我需要一个shell脚本来杀死长时间运行的用户进程(超过一定的时间)。
以下是我对此的观察:
这是我尝试过的:
user = " " " "
for i in user
users="user1 user2 user3"
for u in $users ; do
ps -o etime,pid,comm -u $u | grep "here what i need to grep?" | while read in ; do
ET=`echo $in | cut -f1 -d":"`
[[ $ET -ge 10 ]]&&{ PID=`echo $in | cut -f2 -d" "` ; kill -HUP $PID ; }
done
done
帮帮我
答案 0 :(得分:2)
这将kill -HUP
任何进程(a)属于指定列表中的用户,(b)未附加到终端,(c)超过10分钟:
#!/bin/sh
users=("user1" "user2")
for user in "${users[@]}"
do
ps -o etime,euid,pid,tty,comm -u "$user" | while read etime euid pid tty comm
do
[ "$etime" = ELAPSED ] && continue
[ "$tty" = '?' ] && continue
do_kill=$(echo "$etime" | awk -F'[-:]' 'NF==3{sub(/^/,"0-")} $1>0 || $2>0 ||$3>=10 {print "Kill"}')
[ "$do_kill" ] || continue
kill -HUP "$pid"
done
done
ps
以超过一天的作业的格式days-hh:mm:ss提供已用时间,或者为不到一天的作业提供hh:mm:ss
。 awk
用于解释此问题并确定作业是否为十分钟或更长时间。这是通过以下命令完成的:
echo "$etime" | awk -F'[-:]' 'NF==3{sub(/^/,"0-")} $1>0 || $2>0 ||$3>=10 {print "Kill"}'
如果作业是10分钟或更长时间,awk
会打印Kill
。否则,它什么都不打印。
依次获取awk
命令的每一部分:
-F'[-:]'
这告诉awk
打破破折号或冒号上的字段。
NF==3{sub(/^/,"0-")}
如果只有三个字段,那么我们将缺少的日期字段添加到该行的开头。这可以确保下一个命令看到统一的格式。
$1>0 || $2>0 ||$3>=10 {print "Kill"}
如果(a)天数$1
大于零,或(b)小时数$2
大于零,或(c)小数分钟大于或等于10,然后打印Kill
。否则,不会打印任何内容。
以下提示用户确定将kill -HUP
应用于流程
#!/bin/bash
users=("user1" "user2")
exec 3<&0
for user in "${users[@]}"
do
ps -o etime,euid,pid,tty,comm -u "$user" | while read etime euid pid tty comm
do
[ "$etime" = ELAPSED ] && continue
[ "$tty" = '?' ] && continue
do_kill=$(echo "$etime" | awk -F'[-:]' 'NF==3{sub(/^/,"0-")} $1>0 || $2>0 ||$3>=10 {print "Kill"}')
[ "$do_kill" ] || continue
echo "$user $etime $euid $pid $tty $comm"
read -p "OK to kill this process (y/N)? " -u 3 ok
[[ "${ok,,}" =~ y ]] || continue
echo "Killing $pid"
kill -HUP "$pid"
done
done