Gnu-Screen

如何殺死所有已啟動超過 3 週的螢幕?

  • May 20, 2010

我正在創建一個腳本,我每晚 03.00 都會執行該腳本,該腳本將殺死所有執行時間超過 3 週的螢幕。

有人做過類似的事情可以提供幫助嗎?如果您有更好的方法的腳本或建議,請通過發布提供幫助:)

我在想也許是這樣的。

首先轉儲到文本文件

ps -U 使用者名 -ef | grep 螢幕 >> dump.txt

然後使用正則表達式循環執行 dump.txt 的所有行,並將 STIME > 3weeksago 的 prosses 的 pid 放入數組中。

然後對數組結果執行終止循環。


編輯:添加了我最終得到的腳本

這是我最終得到的腳本,我殺死了所有打開時間超過 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

對於 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 ps什麼是 etime(經過的時間)。

這假設 Linux。

也許這篇SO 文章可以幫助你,看起來很相似。您可以更改正則表達式以匹配您的 3 週。

引用自:https://serverfault.com/questions/143319