如何关闭所有运行时间超过三周的屏幕?

如何关闭所有运行时间超过三周的屏幕?

我正在创建一个脚本,每天晚上 03:00 执行该脚本,它将关闭所有运行时间超过 3 周的屏幕。

有人做过类似的事情可以帮忙吗?如果你有脚本或更好的方法建议,请发帖帮忙 :)

我在想也许有这样的事情。

首先转储到文本文件

ps -U 用户名 -ef | grep SCREEN >> dump.txt

然后使用正则表达式循环遍历 dump.txt 的所有行,并将 STIME > 3weeksago 的进程的 pid 放入数组中。

然后对数组结果执行终止循环。


编辑:添加我最终得到的脚本

这是我最终得到的脚本,我正在关闭用户 1002 打开时间超过 30 天的所有屏幕。

#!/bin/bash

clear
echo "Starting Screen cleanup script this will stop any screens older then 30 days";
echo "Starting in 5 seconds, press ctrl-c to cancel";

    c=1
    while [ $c -le 5 ]
    do
    echo "start $c "
    sleep 1
    ((c++))
    done

    first()
    {
    echo $1
    }

    second()
    {
    echo $2
    }

    third()
    {
    echo $3
    }

    COUNT=0

    ps -e -o "pid etime comm uid" | egrep '1002'  | egrep 'screen' | while read PID ETIME COMM
    do
    case "$ETIME" in
    *:* )

            DAYS=0
            HOURS=0
            MINUTES=0
            SECONDS=0

            case "$ETIME" in
            *-* )
                    X=`echo $ETIME | sed y/-/\ /`
                    DAYS=`first $X`
                    ETIME=`second $X`
                    ;;
            * )
                    ;;
            esac

            X=`echo $ETIME | sed y/:/\ /`

            case "$ETIME" in
            *:*:* )
                    HOURS=`first $X`
                    MINUTES=`second $X`
                    SECONDS=`third $X`
                    ;;
            *:* )
                    MINUTES=`first $X`
                    SECONDS=`second $X`
                    ;;
            *)
                    ;;
            esac

            HOURS=`echo $HOURS + \( $DAYS \* 24 \) | bc`
            MINUTES=`echo $MINUTES + \( 60 \* $HOURS \) | bc`
            SECONDS=`echo $SECONDS + \( 60 \* $MINUTES \) | bc`

            if test "$SECONDS" -gt "2592000"
            then
                    echo $PID $COMM 
                    echo "DIE-DIE-DIE--------------------->killing pid------>"$PID 
                    ((COUNT++))
                    kill -15 $PID
                    echo $COUNT
            fi
            ;;
    * )
            ;;
    esac
    done

答案1

对于 shell,你可以以此为基础进行构建:

ps -A -o etime,pid,cmd | while read etime pid rest; do 
    if grep '^/usr/bin/screen' <(echo $rest) >/dev/null; then 
       echo $etime $pid 
    fi
done

只需解析出大于 x 天的 etime 并终止 pid。查看man psetime(已用时间)是多少。

假设使用 Linux。

答案2

或许SO 文章可以帮到你,看起来很相似。你可以更改正则表达式以匹配你的 3 周。

答案3

killall可以按名称和用户终止进程。

相关内容