From e92654e840033b46ae19e7069c03e60f436d7ae5 Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Sat, 9 May 2026 22:14:15 +0300 Subject: [PATCH] Enhance restart-scheduled.sh script with support for multiple RCON clients and improved installation instructions. Set default RCON timeout and adjust PATH for cron compatibility. --- Server/restart-scheduled.sh | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/Server/restart-scheduled.sh b/Server/restart-scheduled.sh index c9e1e7d..bdac987 100755 --- a/Server/restart-scheduled.sh +++ b/Server/restart-scheduled.sh @@ -5,9 +5,18 @@ # # Требования: # - В server.properties: enable-rcon=true, rcon.password=..., rcon.port=... -# - Утилита mcrcon в PATH (см. README.md в этом каталоге) +# - RCON-клиент в PATH: сначала ищется mcrcon, иначе rcon (github.com/gorcon/rcon-cli) # - Права на systemctl для сервиса (удобнее всего — crontab root) # +# Установка mcrcon, если в apt пакета нет (Linux x86_64, статический бинарник): +# curl -fsSLO https://github.com/Tiiffi/mcrcon/releases/download/v0.7.2/mcrcon-0.7.2-linux-x86-64-static.zip +# unzip -o mcrcon-0.7.2-linux-x86-64-static.zip +# sudo install -m755 mcrcon-0.7.2-linux-x86-64-static/mcrcon /usr/local/bin/ +# +# Сборка из исходников: +# sudo apt install -y git build-essential +# git clone --depth 1 https://github.com/Tiiffi/mcrcon.git && cd mcrcon && make && sudo install -m755 mcrcon /usr/local/bin/ +# # Расписание (каждые 6 часов: 00:00, 06:00, 12:00, 18:00): # crontab -e # 0 */6 * * * /opt/PupaMLupa/Server/restart-scheduled.sh >>/var/log/mc-restart.log 2>&1 @@ -16,8 +25,11 @@ # MINECRAFT_SERVICE — имя unit (по умолчанию: minecraft) # RCON_HOST — хост RCON (по умолчанию: 127.0.0.1) # STOP_WAIT_SEC — макс. ожидание выхода процесса после stop (по умолчанию: 180) +# RCON_TIMEOUT — таймаут для rcon (gorcon), напр. 60s (по умолчанию: 60s) set -euo pipefail +# cron часто даёт урезанный PATH — mcrcon обычно в /usr/bin или /usr/local/bin +export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PATH:-}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "${SCRIPT_DIR}" @@ -25,6 +37,8 @@ cd "${SCRIPT_DIR}" MINECRAFT_SERVICE="${MINECRAFT_SERVICE:-minecraft}" RCON_HOST="${RCON_HOST:-127.0.0.1}" STOP_WAIT_SEC="${STOP_WAIT_SEC:-180}" +RCON_TIMEOUT="${RCON_TIMEOUT:-60s}" +RCON_CLIENT="" LOCK_FILE="${SCRIPT_DIR}/.restart-scheduled.lock" PROPS="${SCRIPT_DIR}/server.properties" @@ -57,7 +71,13 @@ systemctl_wrap() { rcon_exec() { local cmd="$1" - mcrcon -H "${RCON_HOST}" -P "${RCON_PORT}" -p "${RCON_PASSWORD}" "${cmd}" + if [[ "${RCON_CLIENT}" == "mcrcon" ]]; then + mcrcon -H "${RCON_HOST}" -P "${RCON_PORT}" -p "${RCON_PASSWORD}" "${cmd}" + else + # gorcon/rcon-cli: команда передаётся словами, как в консоли сервера (say …, save-all flush, …) + # shellcheck disable=SC2086 + rcon -a "${RCON_HOST}:${RCON_PORT}" -p "${RCON_PASSWORD}" -T "${RCON_TIMEOUT}" ${cmd} + fi } rcon_say() { @@ -71,7 +91,14 @@ if ! flock -n 9; then exit 0 fi -command -v mcrcon >/dev/null 2>&1 || die "нужна утилита mcrcon (например: apt install mcrcon или сборка с https://github.com/Tiiffi/mcrcon)" +if command -v mcrcon >/dev/null 2>&1; then + RCON_CLIENT="mcrcon" +elif command -v rcon >/dev/null 2>&1; then + RCON_CLIENT="rcon" +else + die "нужен RCON-клиент: mcrcon или rcon (https://github.com/gorcon/rcon-cli/releases). См. комментарии в начале этого скрипта — статический mcrcon для x86_64 или сборка из git." +fi +log "RCON-клиент: ${RCON_CLIENT}" if ! systemctl_wrap is-active --quiet "${MINECRAFT_SERVICE}"; then log "сервис ${MINECRAFT_SERVICE} не active — перезапуск не выполняется."