Watchdog скрипт для CentOS 6.9


Возникла нужда поддерживать крайне нестабильный сервис который постоянно падал без какой либо видимой причины. Ввиду того что продукт с закрытым кодом, пришла идея написать простенький watchdog скрипт.

Собственно, вот и он.

По сути, данный скрипт проверяет наличие в таблице процессов указанный в $NAME сервис, и в случае если он его там не находит - автоматически запускает его, после чего высылает оповещение на почту.

#!/bin/bash
#
# watchdog
NAME=main.js # название сервиса в ps
START=/path/to/starting/script # путь до скрипта с запуском сервиса
[email protected] # сюда будет выслано оповещение
[email protected] # СС оповещения
GREP=/bin/grep
PS=/bin/ps
NOP=/bin/true
DATE=/bin/date
MAIL=/bin/mail
RM=/bin/rm
$PS -ef|$GREP -v grep|$GREP $NAME >/dev/null 2>&1
case "$?" in
   0)
   # skip if service is working
   $NOP
   ;;
   1)
  echo "$NAME crashed. Starting $NAME, admin notified."
  $START 2>&1 >/dev/null &
  NOTICE=/tmp/watchdog.txt
  echo "$NAME crashed or was stopped and was started on `$DATE`" > $NOTICE
  $MAIL -n -s "Watchdog alert for service $NAME" -c $NOTIFYCC $NOTIFY < $NOTICE
  $RM -f $NOTICE
  ;;
esac
exit

Далее добавляем в cron следующую запись:

* * * * * /path/to/script.sh

Готово.

P.S

В моем случае, скрипт запуска данного сервиса выглядит вот так:

#!/bin/bash
executableDirectory="$(cd "${0%/*}" 2>/dev/null; echo "$PWD"/"${0##*/}")"
executableDirectory=`readlink --canonicalize "$executableDirectory"`
executableDirectory=`dirname "$executableDirectory"`
jsDirectory="$executableDirectory"
# Check for arch-independent install
MACHINE_TYPE=`uname -m`
if test ${MACHINE_TYPE} = 'x86_64'; then
	executableDirectory="$executableDirectory/builds/linux64"
else
	executableDirectory="$executableDirectory/builds/linux32"
fi
node="$executableDirectory/node"
# If node doesn't exist in the current directory,
# fall back to system-installed version
if ! test -x "$node"; then
	node='/usr/bin/node'
	if ! test -x "$node"; then
		node='/usr/bin/nodejs'
	fi
fi
# Launch it
exec "$node" "$jsDirectory/main.js" [email protected]

Наверх