Files
yarmarka/server.sh
2026-03-20 11:30:30 +03:00

247 lines
6.1 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# server.sh - Bash скрипт для управления сервером
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PID_FILE="$SCRIPT_DIR/server.pid"
LOG_FILE="$SCRIPT_DIR/server.log"
ERROR_LOG="$SCRIPT_DIR/server_error.log"
PYTHON_CMD="python3"
SERVER_SCRIPT="main.py"
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Функция для вывода сообщений
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Проверка, запущен ли сервер
is_running() {
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p "$PID" > /dev/null 2>&1; then
return 0
else
rm -f "$PID_FILE"
return 1
fi
fi
return 1
}
# Получить PID
get_pid() {
if [ -f "$PID_FILE" ]; then
cat "$PID_FILE"
else
echo ""
fi
}
# Запуск сервера
start() {
if is_running; then
log_error "Сервер уже запущен (PID: $(get_pid))"
return 1
fi
log_info "Запуск сервера в фоновом режиме..."
cd "$SCRIPT_DIR" || exit 1
# Запускаем в фоне
nohup $PYTHON_CMD $SERVER_SCRIPT >> "$LOG_FILE" 2>> "$ERROR_LOG" &
PID=$!
echo $PID > "$PID_FILE"
# Ждем немного
sleep 2
if is_running; then
log_success "Сервер запущен (PID: $PID)"
log_info "Логи: $LOG_FILE"
log_info "Логи ошибок: $ERROR_LOG"
return 0
else
log_error "Сервер не запустился"
return 1
fi
}
# Остановка сервера
stop() {
if ! is_running; then
log_error "Сервер не запущен"
return 1
fi
PID=$(get_pid)
log_info "Остановка сервера (PID: $PID)..."
# Пытаемся остановить gracefully
kill -TERM "$PID" 2>/dev/null
# Ждем завершения
for i in {1..10}; do
if ! is_running; then
log_success "Сервер остановлен"
rm -f "$PID_FILE"
return 0
fi
sleep 1
done
# Если не остановился, принудительно завершаем
log_warning "Сервер не отвечает, принудительное завершение..."
kill -KILL "$PID" 2>/dev/null
sleep 1
if ! is_running; then
log_success "Сервер принудительно остановлен"
rm -f "$PID_FILE"
return 0
else
log_error "Не удалось остановить сервер"
return 1
fi
}
# Перезапуск
restart() {
log_info "Перезапуск сервера..."
stop
sleep 2
start
}
# Статус
status() {
if is_running; then
PID=$(get_pid)
log_success "Сервер запущен (PID: $PID)"
# Показываем использование ресурсов
if command -v ps &> /dev/null; then
ps -p "$PID" -o pid,ppid,cmd,%mem,%cpu,etime
fi
# Показываем последние строки лога
if [ -f "$LOG_FILE" ]; then
echo ""
log_info "Последние строки лога:"
tail -5 "$LOG_FILE" | while read line; do
echo " $line"
done
fi
else
log_error "Сервер не запущен"
fi
}
# Показать логи
logs() {
lines=${1:-20}
if [ -f "$LOG_FILE" ]; then
echo "📋 Последние $lines строк лога:"
echo "----------------------------------------"
tail -n "$lines" "$LOG_FILE"
else
log_error "Лог файл не найден"
fi
}
# Показать ошибки
errors() {
lines=${1:-20}
if [ -f "$ERROR_LOG" ]; then
echo "⚠️ Последние $lines строк лога ошибок:"
echo "----------------------------------------"
tail -n "$lines" "$ERROR_LOG"
else
log_info "Лог ошибок не найден"
fi
}
# Очистить логи
clear_logs() {
if [ -f "$LOG_FILE" ]; then
> "$LOG_FILE"
log_success "Лог очищен"
fi
if [ -f "$ERROR_LOG" ]; then
> "$ERROR_LOG"
log_success "Лог ошибок очищен"
fi
}
# Мониторинг в реальном времени
monitor() {
if ! is_running; then
log_error "Сервер не запущен"
return 1
fi
log_info "Мониторинг сервера (Ctrl+C для выхода)..."
tail -f "$LOG_FILE"
}
# Основная логика
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
logs)
logs "$2"
;;
errors)
errors "$2"
;;
clear-logs)
clear_logs
;;
monitor)
monitor
;;
*)
echo "Использование: $0 {start|stop|restart|status|logs|errors|clear-logs|monitor}"
echo ""
echo "Команды:"
echo " start - запустить сервер в фоне"
echo " stop - остановить сервер"
echo " restart - перезапустить сервер"
echo " status - показать статус сервера"
echo " logs [N] - показать последние N строк лога (по умолчанию 20)"
echo " errors [N] - показать последние N строк лога ошибок"
echo " clear-logs - очистить логи"
echo " monitor - мониторинг логов в реальном времени"
exit 1
;;
esac