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

Сценарий оболочки для уничтожения длительно работающих PID

Я надеялся, что кто-нибудь сможет ответить на вопрос об этом сценарии оболочки, который я только что получил, когда захватил веб-сайт, ранее принадлежавший кому-то другому. Это было их исправление для резервного копирования, чтобы поймать любых долго работающих рабочих 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