Я надеялся, что кто-нибудь сможет ответить на вопрос об этом сценарии оболочки, который я только что получил, когда захватил веб-сайт, ранее принадлежавший кому-то другому. Это было их исправление для резервного копирования, чтобы поймать любых долго работающих рабочих apache, которые их приложение не убивало правильно (веб-сервер запускает только это приложение, а не другие веб-сайты).
Если этот скрипт запускается каждую минуту, я считаю, что он убивает /usr/sbin/httpd
ПИД-регуляторы, проработавшие более 60 минут.
Основной вопрос: Я вижу 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
Вероятно, автор вашего сценария не знал о возможностях «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