247 lines
6.1 KiB
Bash
Executable File
247 lines
6.1 KiB
Bash
Executable File
#!/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 |