Войти или зарегистрироваться

Утилита Профессиональный start.sh. Профилирование и не только

  • Автор темы Автор темы Dymeth
  • Дата начала Дата начала

Dymeth

Активный участник
Пользователь
Баллы
98
Имя в Minecraft
Dymeth
Писал для себя скрипт запуска. За несколько лет он оброс большим количеством функций. Делюсь с вами.
Работает только в Linux (shell + bash).

Возможности и особенности:
- Использование флагов от Aikar (само собой)
- Автоматический перезапуск сервера при остановке/падении (само собой)
- Все функции подробно описаны на русском языке
- Удобная идентификация процесса сервера в top/htop и т.д.
- Автоматическое создание сессии screen/tmux (и при желании переход "внутрь")
- Профилирование и/или отладка (без конфликта с флагами от Aikar)
- Указание конфига log4j2
- Принудительное обновление данных миров на актуальный формат версии игры
- Частичное решение проблем с запуском на Java 12+

Использование элементарное:
1) Перейти в папку сервера при помощи cd
2) Запустить скрипт: sh start.sh или ./start.sh (во втором случае должны быть права на исполнение файла)

При необходимости некоторые параметры можно принимать прямо из командной строки при запуске скрипта. А это позволит автоматизировать запуск серверов (например, для мини-игр).

Помимо этого, в spigot.yml рекомендую параметру "restart-on-crash" задать значение "false".

Посмотреть скрипт с подсветкой синтаксиса:
https://gitlab.com/Dymeth/MCServerStarter/-/blob/master/start.sh

Скачать скрипт автоматически:
Код:
wget https://gitlab.com/Dymeth/MCServerStarter/-/raw/master/start.sh
chmod 744 start.sh

Для автозапуска скрипта при ребуте машины можно настроить задачу в cron:
@reboot cd /home/директория_сервера/;sh ./start.sh;

P.S. Для работы требуется bash 4.0 или новее
 
Последнее редактирование:
Может вариант с Tmux запилишь?
 
Может я что-то не так делаю, но при запуске скрипта консоль ругается с ошибкой на do
159xjt0
Budd-PEUu-St-SVQAQV9-EWo-Kg.png
 
Может я что-то не так делаю, но при запуске скрипта консоль ругается с ошибкой на do
159xjt0
Budd-PEUu-St-SVQAQV9-EWo-Kg.png
PowerShell что ли? Вообще, скрипт под линуксовские shell и bash.

Может вариант с Tmux запилишь?
Да по идее каждый может под себя переделать, не сложно под tmux. Сам сейчас вообще пользую докеры вместо screen с tmux. Вот это реально челлендж
 
Последнее редактирование:
PowerShell что ли? Вообще, скрипт под линуксовские shell и bash.


Да по идее каждый может под себя переделать, по идее не сложно под tmux. Сам сейчас вообще пользую докеры вместо screen с tmux
Всё, я понял в чём проблема. При создании start.sh на Windows ругается Linux.
Чтобы исправить это, через Git Bash(либо другой удобный вам имитатор Linux) нужно преобразовать start.sh виндосовкий в Unix для linux командой
Код:
$ dos2unix srcFile outFile
Я сам работаю с Windows, но с Linux только начинаю работать, вот и исполняю такие траблы
 
Всё, я понял в чём проблема. При создании start.sh на Windows ругается Linux.
Чтобы исправить это, через Git Bash(либо другой удобный вам имитатор Linux) нужно преобразовать start.sh виндосовкий в Unix для linux командой
Код:
$ dos2unix srcFile outFile
Я сам работаю с Windows, но с Linux только начинаю работать, вот и исполняю такие траблы
Извращенец
 
Вопрос, как адаптировать этот скрин под BungeeCord?
 
Бро, а почему не:
Код:
#!/bin/bash
?
Потому что скрипт позволяет запускать его и через sh, хотя вторая часть скрипта выполняется исключительно bash (независимо от того, чем запускали). Можешь сразу через bash запускать - ничего не сломается
 
Потому что скрипт позволяет запускать его и через sh, хотя вторая часть скрипта выполняется исключительно bash (независимо от того, чем запускали). Можешь сразу через bash запускать - ничего не сломается
Да я знаю что делает этот комментарий, я просто спросил почему ты используешь старую версию консоли
 
Да я знаю что делает этот комментарий, я просто спросил почему ты используешь старую версию консоли
Использовать можно что угодно - это будет работать. Разницы нет
 
Последнее редактирование:
Добавлю: старт можно быстрее сделать через
Код:
./start.sh

Вопрос: как его корректно останавливать??? После "stop" он перезапускается...
 
Добавлю: старт можно быстрее сделать через
Код:
./start.sh

Вопрос: как его корректно останавливать??? После "stop" он перезапускается...
CTRL+C до полного прекращения выполнения
 
Обновил скрипт. Если хотите перейти на новую версию - необходимо скачать скрипт заново и настроить параметры вручную.

Изменения (v1.1):

1) Скрипт влил в гит, это позволяет качать его автоматически. Ссылки на скрипт в первом посте.

2) Поддержка tmux:
- Добавлен параметр execution_type. Может принимать значение screen или tmux
- Параметр join_screen переименован в auto_console_join

3) Автоматический поиск jar-файла ядра. Это удобно при частом обновлении ядра. При необходимости название джарника всё ещё можно указать вручную в параметре jar_file

4) Параметр debugging_port переименован в debug_agent_address, поскольку принимает теперь не только порт, но и хост (адрес бинда)

5) Все комментарии продублированы на английском языке, добавлено больше примеров использования параметров

6) Небольшие технические изменения (багфиксы и читабельность)

В планах ещё поддержка запуска через врапперы (Gravit Launcher, Keiko Plugin Inspector т.д.), а также поддержка запуска BungeeCord и Velocity. Но когда это будет, и будет ли вообще - без понятия. В теории и с текущим скриптом можно накостылять всё это, но это на ваш откуп.

Ещё в будущем добавлю аргумент --add-modules=jdk.incubator.vector как обязательный.

PHP:
#!/bin/sh

# Все системные пути и названия файлов чувствительны к регистру (заглавные и строчные буквы)

# Параметры приложения-сервера

server_name="lobby" # Для создания скрина и идентификации процесса в top, htop и т.д.
join_screen=true # Входить ли в скрин автоматически после запуска скрипта
jar_file="paper.jar" # Название файла ядра
min_memory="1G" # Минимальное количество памяти
max_memory="5G" # Максимальное количество памяти
server_port="" # Порт. Если не указан - используется значение из server.properties
force_chunks_upgrade=false # Использовать ли при запуске принудительное обновление всех чанков до формата текущей версии ядра

# Параметры Java

java_dir="~/jdk-16.0.1/bin" # Директория Java (для JDK добавьте в конце "/bin"). Если не указана - используется системный путь
profiling=false # Включить ли профилирование (требуется больше системных ресурсов). Работает только с JDK
fix_java_12_issues=false # Предотвращать ли ошибки, связанные с использованием Java 12+
debugging_port="" # Порт агента отладки. Если не указан - отладка отключена
log4j_config="" # Файл параметров log4j с расширением .xml. Если не указано - используются настройки по-умолчанию



# Всё, что ниже, менять не рекомендуется

# Источник: https://mcflags.emc.gs
aikar_jvm_flags="-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true"
jvm_flags="-server -Dfile.encoding=UTF-8"
app_flags="nogui"
screen_name="${server_name}"
htop_name="${server_name}"
script_name=`basename "$0"`

if [ "$1" != "screen" ]; then
    screen -A -m -d -S ${screen_name} bash ${script_name} screen
    [ "$join_screen" = true ] && screen -x ${screen_name}
    exit
fi

#!/bin/bash

[ "$java_dir" != "" ] && java_dir="${java_dir}/"

jvm_flags="${jvm_flags} ${aikar_jvm_flags}"
if [ "$profiling" = true ]; then
    htop_name="${htop_name}-profiling"
    jvm_flags="${jvm_flags// -XX:+PerfDisableSharedMem/}"
    jvm_flags="${jvm_flags} -Xshare:off"
fi
htop_name="$USER.${htop_name}"

[ "$fix_java_12_issues" = true ] && jvm_flags="${jvm_flags} --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED --add-opens java.base/java.security=ALL-UNNAMED"
[ "$debugging_port" != "" ] && jvm_flags="${jvm_flags} -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:${debugging_port}"
[ "$log4j_config" != "" ] && jvm_flags="${jvm_flags} -Dlog4j.configurationFile=${log4j_config}"

[ "$server_port" != "" ] && app_flags="${app_flags} -port ${server_port}"
[ "$force_chunks_upgrade" = true ] && app_flags="${app_flags} --forceUpgrade"

jvm_flags="-D_server=${htop_name} -Xms${min_memory} -Xmx${max_memory} ${jvm_flags}"

while true
do
    eval ${java_dir}java ${jvm_flags} -jar ${jar_file} ${app_flags}
    echo "Server $screen_name stopped. Rebooting in:"
    for i in {3..1}
    do
        echo "$i..."
        sleep 1
    done
done

# Автор скрипта: dymeth.ru

Может вариант с Tmux запилишь?
Не знаю, актуально ли, но сделал
 
Последнее редактирование:
Назад
Верх