#!/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