Нужна помощь с скриптом для проверки использования памяти

Я пытаюсь создать временную ленту, пока я разрабатываю решение для утечки памяти приложения. То, что я написал, было небольшим сценарием bash который я ввел в корневой каталог сервера. Это то, что сценарий должен делать:

  1. Получите местоположение, в котором он запущен
  2. Проверьте, есть ли скрипт crontab
  3. Если не в crontab, добавьте кронтаб для запуска каждые 5 минут
  4. Проверьте память и проверьте, соответствует ли%% percent_allowed
  5. Если выше тест, перезапустите службы nginx & php-fmp

memory_protect.sh :

 #!/bin/sh cronfile=memory_protect.sh #NOTE THIS SHOULD DETECT IT'S SELF path=pwd #this is the path to the file percent_allowed=80 #this should be max memory before action has_cron(){ #is the file in the cron? return [[ crontab -l | egrep -v '^$|^#' | grep -q $cronfile ]] && return 1 || return 0 } test_memory(){ memusage=`top -n 1 -b | grep "Mem"` MAXMEM=`echo $memusage | cut -d" " -f2 | awk '{print substr($0,1,length($0)-1)}'` USEDMEM=`echo $memusage | cut -d" " -f4 | awk '{print substr($0,1,length($0)-1)}'` USEDMEM1=`expr $USEDMEM \* 100` PERCENTAGE=`expr $USEDMEM1 / $MAXMEM` #if it's above 80% alert return [[ $PERCENTAG>$percent_allowed ]] && return 1 || return 0 } if [[ has_cron -eq 0 ]] then #was not here so add #run this script every 5 mins */5 * * * $path/$cronfile fi if [[ test_memory ]] then #clear some memory /etc/init.d/nginx restart /etc/init.d/php-fpm restart fi 

Тест памяти, похоже, работает, когда я запускаю это самостоятельно, но это в целом не работает.


Обновление Мне нужно было запустить dos2unix в файле, но я также понял, что в конце концов возвращаюсь к условиям каждой функции … так что это не сработает. Прямо сейчас, похоже, что [[ по утверждению if не найден.


Update 2 Похоже на то, что он запускает перезапуск служб, но он не помещает задание cron .. поэтому я не вижу, чтобы он работал

 #!/bin/bash cronfile=memory_protect.sh #NOTE THIS SHOULD DETECT IT'S SELF path=pwd #this is the path to the file percent_allowed=80 #this should be max memory before action has_cron(){ #is the file in the cron? #return 0 #returning this just to test should #be the next line but it's not working return 0 [[ crontab -l | egrep -v '^$|^#' | grep -q $cronfile ]] && return 1 || return 0 } test_memory(){ memusage=`top -n 1 -b | grep "Mem"` MAXMEM=`echo $memusage | cut -d" " -f2 | awk '{print substr($0,1,length($0)-1)}'` USEDMEM=`echo $memusage | cut -d" " -f4 | awk '{print substr($0,1,length($0)-1)}'` USEDMEM1=`expr $USEDMEM \* 100` PERCENTAGE=`expr $USEDMEM1 / $MAXMEM` #if it's above 80% alert [[ $PERCENTAG -gt $percent_allowed ]] && return 1 || return 0 } if [[ has_cron -eq 0 ]] then #was not here so add #run this script every 5 mins #crontab -e */5 * * * $path/$cronfile cat <(crontab -l) <(echo "*/5 * * * $path/$cronfile") | crontab - else echo "cron present" fi if [ test_memory ] then #clear some memory sudo /etc/init.d/nginx restart sudo /etc/init.d/php-fpm restart fi 

Сейчас я думаю, что это исправлено.

2 Solutions collect form web for “Нужна помощь с скриптом для проверки использования памяти”

Чтобы создать запись crontab через скрипт Bash, вам необходимо изменить эту строку:

 */5 * * * * $path/$cronfile 

Что-то вроде этого:

 # Write out current crontab crontab -l > mycron # Echo new cron into cron file echo "*/5 * * * * $path/$cronfile" >> mycron # Install new cron file crontab mycron rm mycron 

Вы также можете получить фантазию и сделать все это с помощью одного лайнера:

 cat <(crontab -l) <(echo "*/5 * * * $path/$cronfile") | crontab - 

Ваш скрипт

Вот модифицированная версия вашего скрипта, которая работает для меня.

 #!/bin/sh cronfile=memory_protect.sh #NOTE THIS SHOULD DETECT IT'S SELF path=$(pwd) #this is the path to the file percent_allowed=80 #this should be max memory before action has_cron(){ #is the file in the cron? #return 0 #returning this just to test should #be the next line but it's not working if crontab -l | egrep -v '^$|^#' | grep -q $cronfile; then return 1 else return 0 fi } test_memory(){ memusage=$(top -n 1 -b | grep "Mem") MAXMEM=$(echo $memusage | cut -d" " -f2 | awk '{print substr($0,1,length($0)-1)}') USEDMEM=$(echo $memusage | cut -d" " -f4 | awk '{print substr($0,1,length($0)-1)}') USEDMEM1=$(expr $USEDMEM \* 100) PERCENTAGE=$(expr $USEDMEM1 / $MAXMEM) #if it's above 80% alert [[ $PERCENTAG>$percent_allowed ]] && return 1 || return 0 } if has_cron; then #was not here so add #run this script every 5 mins #crontab -e */5 * * * $path/$cronfile #cat <(crontab -l) <(echo "*/5 * * * $path/$cronfile") | crontab - crontab -l > mycron # Echo new cron into cron file echo "*/5 * * * * $path/$cronfile" >> mycron # Install new cron file crontab mycron rm mycron else echo "cron present" fi if test_memory; then #clear some memory echo "/etc/init.d/nginx restart" echo "/etc/init.d/php-fpm restart" fi 

пример

 $ ./memory_protect.sh /etc/init.d/nginx restart /etc/init.d/php-fpm restart $ crontab -l */5 * * * * /home/saml/tst/91789/memory_protect.sh 

Сценарий должен иметь эти две строки, модифицированные так, чтобы они фактически перезапустили службы nginx и php-fpm .

Измените эти строки: echo "/etc/init.d/nginx restart" echo "/etc/init.d/php-fpm restart"

К этим:

  /etc/init.d/nginx restart /etc/init.d/php-fpm restart 

Я сделал это, чтобы увидеть, что скрипт работает правильно. ПРИМЕЧАНИЕ. Что эти строки перезапуска должны иметь префикс sudo если этот скрипт работает как кто-либо, кроме root!

sudo /etc/init.d/nginx restart sudo /etc/init.d/php-fpm restart

Это использование, скорее всего, должно будет иметь привилегии NOPASSWD по крайней мере на этих двух сценариях, иначе он будет ждать, когда пользователь, которому принадлежит cron, предоставит пароль.

Запись Crontab не существует?

Вы столкнулись с этой проблемой, когда ваш crontab еще не был создан в каталоге, /var/sppol/cron . Вы столкнетесь с этим, когда вы запустите crontab -l следующим образом:

 $ crontab -l no crontab for saml 

Двойная проверка:

 $ sudo ls -l /var/spool/cron/ total 0 -rw------- 1 root root 0 Sep 16 23:47 root 

Поэтому просто сделайте так, как будто вы собираетесь редактировать его, и сохраните пустой файл, чтобы создать его:

 $ crontab -e # now you're in the vim editor, add a empty line # type "i", hit return, hit Escape, # and do a Shift + Z + Z to save! 

Теперь вы должны увидеть следующее:

 $ crontab -l $ 

И это:

 $ sudo ls -l /var/spool/cron/ total 0 -rw------- 1 root root 0 Sep 16 23:47 root -rw------- 1 saml root 0 Sep 21 16:20 saml 

Перезапуск служб

Другая проблема, с которой вы столкнетесь, – это если эта запись crontab работает как пользователь user1, тогда пользователю1 потребуются права sudo для их перезапуска.

Я бы использовал monit для этого

Вот пример сценария monit, для вашего требования

 check process nginx with pidfile /var/run/nginx.pid start program = "/etc/init.d/nginx start" stop program = "/etc/init.d/nginx stop" if memory usage > 95% then restart group www-data if 5 restarts within 5 cycles then timeout 

Попробуйте перезагрузить 5 раз; если monit не может перезапустить веб-сервер 5 раз; просто тайм-аут, чтобы избежать состояния гонки.

Ссылка ссылки

  • Добавление метки времени в файл журнала с помощью команды cronjob
  • Могу ли я автоматизировать многотомную функцию tar?
  • Таинственные автоматические письма
  • Задача Cron для выполнения файлов jar файлов по рабочим дням по местному времени с 8 до 17 часов, без выходных
  • Отдельное имя хоста сервера, отображаемое в журналах cron этого сервера
  • Использование nohup для непрерывного выполнения сценария
  • Не удается выполнить ssh на удаленную машину, используя сценарий оболочки в Crontab
  • что означает crond : (* system *) RELOAD (/etc/cron.d/mycron)
  • Как выяснить, что происходит при перезагрузке запланированного сервера?
  • Xdotool с использованием «DISPLAY =: 0» не работает в Crontab
  • Что означает «/ bin / sh -c nice run-parts -report /etc/cron.daily»?
  • Linux и Unix - лучшая ОС в мире.