feat: add bot control script to prevent multiple instances
Some checks reported errors
continuous-integration/drone/push Build encountered an error

- Add bot_control.sh script for safe bot management
- Prevent 'Conflict: terminated by other getUpdates' error
- Add Makefile commands: bot-start, bot-stop, bot-restart, bot-status, bot-logs
- Add BOT_MANAGEMENT.md with usage instructions
- Use PID file to track single bot instance
- Auto-stop all old processes before starting
- Add .bot.pid to .gitignore

Fixes issue where multiple bot instances cause command processing failures
This commit is contained in:
2025-11-17 06:44:43 +09:00
parent d3f9f2fb53
commit 72e95db811
4 changed files with 293 additions and 1 deletions

125
bot_control.sh Executable file
View File

@@ -0,0 +1,125 @@
#!/bin/bash
# Скрипт для управления ботом (запуск/остановка/перезапуск)
BOT_DIR="/home/trevor/new_lottery_bot"
LOG_FILE="/tmp/bot_single.log"
PID_FILE="$BOT_DIR/.bot.pid"
case "$1" in
start)
echo "🚀 Запуск бота..."
cd "$BOT_DIR"
# Проверяем не запущен ли уже
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p "$PID" > /dev/null 2>&1; then
echo "⚠️ Бот уже запущен (PID: $PID)"
exit 1
fi
fi
# Останавливаем все старые процессы
pkill -9 -f "python main.py" 2>/dev/null
sleep 2
# Запускаем бота
. .venv/bin/activate
nohup python main.py > "$LOG_FILE" 2>&1 &
NEW_PID=$!
echo $NEW_PID > "$PID_FILE"
sleep 3
if ps -p $NEW_PID > /dev/null; then
echo "✅ Бот запущен (PID: $NEW_PID)"
echo "📋 Логи: tail -f $LOG_FILE"
else
echo "❌ Не удалось запустить бота"
rm -f "$PID_FILE"
exit 1
fi
;;
stop)
echo "🛑 Остановка бота..."
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p "$PID" > /dev/null 2>&1; then
kill -15 "$PID"
sleep 2
if ps -p "$PID" > /dev/null 2>&1; then
kill -9 "$PID"
fi
echo "✅ Бот остановлен"
else
echo "⚠️ Процесс не найден"
fi
rm -f "$PID_FILE"
else
# Останавливаем все процессы python main.py на всякий случай
pkill -9 -f "python main.py" 2>/dev/null
echo "✅ Все процессы остановлены"
fi
;;
restart)
echo "🔄 Перезапуск бота..."
$0 stop
sleep 2
$0 start
;;
status)
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p "$PID" > /dev/null 2>&1; then
echo "✅ Бот работает (PID: $PID)"
echo "📊 Статистика процесса:"
ps aux | grep "$PID" | grep -v grep
# Проверяем последние ошибки
if grep -q "ERROR.*Conflict" "$LOG_FILE" 2>/dev/null; then
echo "⚠️ В логах обнаружены ошибки конфликта!"
echo "Последние ошибки:"
tail -n 100 "$LOG_FILE" | grep "ERROR.*Conflict" | tail -3
else
echo "✅ Ошибок конфликта не обнаружено"
fi
else
echo "❌ Бот не работает (PID файл существует, но процесс не найден)"
rm -f "$PID_FILE"
fi
else
# Проверяем запущенные процессы
COUNT=$(ps aux | grep "python main.py" | grep -v grep | wc -l)
if [ "$COUNT" -gt 0 ]; then
echo "⚠️ Найдено $COUNT процессов бота (без PID файла)"
ps aux | grep "python main.py" | grep -v grep
else
echo "❌ Бот не запущен"
fi
fi
;;
logs)
if [ -f "$LOG_FILE" ]; then
tail -f "$LOG_FILE"
else
echo "❌ Файл логов не найден: $LOG_FILE"
fi
;;
*)
echo "Использование: $0 {start|stop|restart|status|logs}"
echo ""
echo "Команды:"
echo " start - Запустить бота"
echo " stop - Остановить бота"
echo " restart - Перезапустить бота"
echo " status - Проверить статус бота"
echo " logs - Показать логи бота (Ctrl+C для выхода)"
exit 1
;;
esac
exit 0