Назад | Перейти на главную страницу

Как убить все экраны, которые стояли дольше 3х недель?

Я создаю сценарий, который я выполняю каждую ночь в 03.00, который убьет все экраны, работающие более 3 недель.

кто-нибудь делал что-нибудь подобное, что может помочь? Если у вас есть сценарий или предложение лучшего метода, помогите, разместив сообщение :)

Я подумал, может быть, что-то вроде этого.

Сначала сделайте дамп в текстовый файл

ps -U имя пользователя -ef | grep ЭКРАН >> dump.txt

затем выполните цикл, проходящий через все строки файла dump.txt с регулярным выражением, и поместите в массив pid всех строк с STIME> 3weeksago.

затем выполните цикл уничтожения для результата массива.


изменить: добавлен скрипт, с которым я закончил

Это сценарий, с которым я закончил, я убил все экраны, которые были открыты более 30 дней, покупая пользователя 1002.

#!/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

Для оболочки вы можете построить из этого:

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

Просто проанализируйте etime для дней больше x и убейте pid. Видеть man ps в какое время (прошедшее время).

Это предполагает Linux.

Может быть этот ТАК статья может вам помочь, похоже. Вы можете изменить регулярное выражение, чтобы оно соответствовало вашим 3 неделям.

killall может убивать процессы по имени и пользователю.