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

Bash-скрипт для уничтожения определенного процесса, который работает дольше 5 м.

Привет, я ищу сценарий BASH для CentOS 6.5, который убивает процессы по имени, которые выполняются более 5 минут. Я задавал этот вопрос раньше и получил ответ, который не работает в CentOS, потому что killall не имеет --older-than. Я ищу аналог, который будет работать под CentOS.

Этот пост здесь: Убейте любой процесс GS, который выполнялся более 5 минут на CentOS 6.5.

Спасибо!

Я действительно предлагаю найти первопричину Эта проблема (или Эта проблема или Эта проблема).

А killall - это деспотичный подход к управлению процессами, и ваша реальная проблема, вероятно, связана с проблемой приложения или ресурсов.

Можете рассказать, что вы пробовали до сих пор? Я бы хотел проверить следующие типы вещей:

  • Жизненно важные параметры системы в то время, когда происходят эти неконтролируемые процессы Ghostscript: RAM? ЦПУ?
  • Убедитесь, что в системе, в которой это работает, достаточно памяти и нет серьезных конфликтов за другие ресурсы.
  • Это физический или виртуальный сервер?
  • Поговорите с продавцом. Есть сообщество и некоторый уровень поддержки вокруг PrinceXML.
  • Возможный strace затронутых PID и родительских PID.
  • Все ли необходимые шрифты установлены?
  • Попробуйте записать время, когда это происходит, чтобы увидеть, есть ли корреляция между зависанием и другими системными событиями.
  • Если у вас нет исторического и детального мониторинга, вам следует это сделать. Вы даже можете попробовать что-нибудь вроде NewRelic чтобы попытаться получить представление о том, что происходит или произошло в данный момент.
  • Проверьте настройки apache. Похоже, что Ghostscript создается пользователем apache. Есть ли здесь какие-либо ограничения или настройки сервера, которые следует изучить?

На основе ваш вывод из предыдущего вопроса, похоже, вы выделили только 1 гигабайт оперативной памяти для этой системы и, возможно, у вас только один процессор - без свопа ...

Если ничего не помогает, вы можете написать сценарий, который может очистить старые или остановленные процессы ... или просто скомпилировать версию killall который поддерживает --older-than флаг.

Будет ли что-то подобное?

#!/bin/bash

PROC_NAME=my_proc_name

# Get all PIDs for process name
procs=(`ps aux | grep  $PROC_NAME | awk '{print $2}'`)

# for each PID in PIDs array
for pid in $procs; do
    # get elapsed time in form mm:ss and remove ":" character
    # to make it easier to parse time 
    time=(`ps -o etime $pid | sed -e 's/[:-]/ /g'`)
    # get minutes from time
    min=${time[1]}
    # if proces runs 5 minutes then kill it
    if [ "$min" -gt "5" ]; then
        kill -9 $pid
    fi
done;

Конечно, это должно выполняться cron или чем-то в этом роде, чтобы периодически проверять процессы.