我希望有人能回答有关这个 shell 脚本的问题,这是我在接管别人的网站时刚刚获得的。这是他们的备份修复程序,用于捕获任何长时间运行的 Apache Worker,这些 Worker 是他们的应用程序未正确终止的(Web 服务器只运行此应用程序,不运行其他网站)。
如果这个脚本每分钟运行一次,我相信它会终止/usr/sbin/httpd
运行时间超过 60 分钟的 PID。
主要问题:我MAXRUNMIN=60
和 一样明白runTimeMin=$((runTimeSec / 60 ))
。是否需要同时更改这两项才能将此限制从 60 分钟更改为 30 分钟?
后续问题:我看到它通过执行获取 PID 列表grep "/usr/sbin/httpd"
。我如何才能将另一个进程也添加到此搜索中。例如,不仅要 grep 并检查以终止httpd
PID,还要检查另一个进程(例如python
PID)。
#!/bin/sh
##number of minutes to allow a process to run
MAXRUNMIN=60
PIDS=`pgrep httpd|xargs echo -e`
nowSeconds=`date +%s`
#for i in `ps aux | grep -vE 'grep|root' | grep httpd | awk ' { print $9 "-" $2 } '`
for i in `ps aux | grep -vE 'grep|root' | grep "/usr/sbin/httpd" | awk ' { print $9 "-" $2 } '`
do
procStart=`echo $i|awk -F"-" '{print $1}'`
procId=`echo $i|awk -F"-" '{print $2}'`
procSec=`date -d"$procStart" +%s`
runTimeSec=$((nowSeconds - procSec))
runTimeMin=$((runTimeSec / 60 ))
if [ $runTimeMin -gt $MAXRUNMIN ]
then
echo $PIDS|grep -q $procId
if [ $? -eq 0 ]
then
echo "process ID $procId has been running loger than $MAXRUNMIN minutes"
kill -9 $procId
fi
fi
done
答案1
您的脚本的作者可能没有意识到“ps”的可能性,例如“-u”(后跟所有者列表)或“-o etimes=”(以秒为单位给出经过的时间),这使得任务变得简单得多。我有一个脚本,它被称为“my_corona.sh”,它如下所示:
#! /usr/bin/ksh
# kills older processes
MCRNMAXMIN=60
MCRNPROGS="apache2|nginx" # pipe separated list of executables
MCRNOWNERS="www-data" # comma separated list of process owners
MCRNTIME=$(expr $MCRNMAXMIN \* 60)
ps -u $MCRNOWNERS -o pid=,etimes=,args= | grep -E "($MCRNPROGS)" \
| while read P T X
do
if [ $MCRNTIME -lt $T ]
then
echo "$P $T $X :: should be killed"
kill -1 $P # kill nicely
sleep 5
if kill -0 $P 2>/dev/null
then
echo "$P $T $X :: didn't like it"
kill -9 $P # kill not so nicely
fi
# else
# echo "$P $T $X :: should not be killed"
fi
done