使用shell脚本在Linux中终止长时间运行的用户进程

时间:2015-02-13 06:38:31

标签: linux bash shell

我需要一个shell脚本来杀死长时间运行的用户进程(超过一定的时间)。

以下是我对此的观察:

  1. 该脚本不会终止任何守护进程
  2. 脚本需要识别用户列表并需要检查它是否是守护进程?为此我们可以检查进程所依赖的终端(通常守护进程不依赖于任何终端)< / LI>
  3. 需要通过脚本自动收集进程ID和名称。首先需要获取所有进程的Elapsed时间并检查我们的时间限制,从这里我们过滤出超出我们的进程列表限制并检查它是否依赖于任何终端以及进程运行的用户。
  4. 在删除流程之前,我们需要确认是否可以终止流程?
  5. 这是我尝试过的:

    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 
    

    帮帮我

1 个答案:

答案 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:ssawk用于解释此问题并确定作业是否为十分钟或更长时间。这是通过以下命令完成的:

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