Автоматизация запуска бота на VDS

| Комментариев: 2 | Нет трекбэков

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

В чем состоит проблема?

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

Я решил эти вопросы с помощью небольшого скрипта, который привожу ниже:

#! /bin/sh

JAVA=/usr/bin/java
JAR_HOME=/home/spec/bot
JAR=bot.jar
PID=$JAR_HOME/bot.pid
STATE=$JAR_HOME/state

d_start() {
    if [ -f $PID ]; then
	PID_VALUE=`cat $PID`
	if [ ! -z "$PID_VALUE" ]; then
	    PID_VALUE=`ps ax | grep $PID_VALUE | grep -v grep | awk '{print $1}'`
	    if [ ! -z "$PID_VALUE" ]; then
		exit 1;
	    fi
	fi
    fi
    
    PREV_DIR=`pwd`
    cd $JAR_HOME
    exec $JAVA -Xmx50m -jar $JAR &
    echo $! > $PID
    cd $PREV_DIR
}

d_stop() {
    if [ -f $PID ]; then
	PID_VALUE=`cat $PID`
	if [ ! -z "$PID_VALUE" ]; then
	    PID_VALUE=`ps ax | grep $PID_VALUE | grep -v grep | awk '{print $1}'`
	    if [ ! -z "$PID_VALUE" ]; then
		echo "Stop" > $STATE;
		WAIT_TIME=0
		while [ `ps ax | grep $PID_VALUE | grep -v grep | wc -l` -ne 0 -a "$WAIT_TIME" -lt 20 ]
		do
		    sleep 1
		    WAIT_TIME=$(expr $WAIT_TIME + 1)
		done
		if [ `ps ax | grep $PID_VALUE | grep -v grep | wc -l` -ne 0 ]; then
		    kill -9 $PID_VALUE
		fi
	    fi
	fi
	rm -f $PID
    fi
}

case "$1" in
    start)
	d_start
    ;;
    stop)
	d_stop
    ;;
    restart)
	d_stop
	d_start
    ;;
    *)
	echo "Usage: $0 {start|stop|restart}" >&2
	exit 1
    ;;
esac

exit 0

В переменную JAR_HOME записываем путь до папки с нашим ботом, а в переменную JAR - имя самого jar файла бота. Сохраните текст скрипта в файле в вашем домашнем каталоге, например "bot.sh", затем предоставьте ему права на запуск.

Чтобы запустить бота, нужно набрать команду (находясь в домашней иректории): ./bot.sh start

Если бот уже запущен, команда ничего не сделает. После запуска в директории бота будет создан файл "bot.pid" с идентификатором процесса, именно по нему и определяется факт работы бота.

Для остановки бота наберите команду: ./bot.sh stop

Эта команда сначала попытается остановить бота обычным способом - записав "Stop" в файл "state". Если бот завис - процесс будет уничтожен принудительно.

Для перезапуска бота нужно использовать команду: ./bot.sh restart

Теперь запишем задание в cron, чтобы наш бот запускался автоматически.

Любимым текстовым редактором создадим файлик со следующими строчками:

*/30 * * * * /home/spec/bot/bot.sh start >/dev/null 2>&1
* 4 * * * /home/spec/bot/bot.sh restart >/dev/null 2>&1

Обзовем наш файлик, к примеру, "cron.tab". Добавим задание в cron от имени нашего пользователя следующей командой: crontab ./cron.tab

Набрав "crontab -l" можно убедиться, что наши задания добавлены. Команда "crontab -r" позволяет удалить все задания, если они больше не нужны.

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

Нет трекбэков

URL для трекбэков: http://jimbot.ru/cgi-bin/mt-tb.cgi/97

Комментариев: 2

Spec спасибо за скрипт :)

Спасибо!

Loading

Об этой записи

Сообщение опубликовано 19.10.2009 22:14. Автор — Spec.

Предыдущая запись — Изменение условий предоставления услуг FirstVDS

Следующая запись — День рождения проекта

Смотрите новые записи на главной странице или загляните в архив, где есть ссылки на все сообщения.

Хостинг для чата

Рейтинг@Mail.ru службы мониторинга серверов