我正在创建一个脚本,每天晚上 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 ps
etime(已用时间)是多少。
假设使用 Linux。
答案2
或许这SO 文章可以帮到你,看起来很相似。你可以更改正则表达式以匹配你的 3 周。
答案3
killall
可以按名称和用户终止进程。