1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Перенаправление команды сервера в консоль linux

Тема в разделе "Управление сервером Bukkit", создана пользователем Max0n, 15 июл 2016.

  1. Автор темы
    Max0n

    Max0n Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Max0n
    Здравствуйте. У меня есть сервер, который запускается так:
    #!/bin/bash
    while true
    do
    java -jar core.jar
    done
    и все это запускается в скрине. Соответственно, если сервер по каким-то причинам падает/останавливается - оператор wihle запускает его заново. Мне нужно, чтобы при вводе в консоль сервера команды /stop сервер останавливался, а не запускался снова. Единственное, к чему я пришел - надо, чтобы скрипт как-то считывал команды с сервера и выполнял остановку оператора while (который создает бесконечный цикл). Может быть это реализуемо с помощью оператора until или как-то по-другому? Иные варианты, типа "Убивай скрин вручную" не годятся. Спасибо!
     
    Последнее редактирование: 15 июл 2016
  2. InterVi

    InterVi Старожил Пользователь

    Баллы:
    173
    Лог придётся анализировать, что команда действительно сработала, а не кто-то без прав её прописал. Либо только от консоли.
     
  3. Автор темы
    Max0n

    Max0n Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Max0n
    У меня был такой вариант. Поскольку сервер при остановке выводит "Stopping server", я сделал так.

    #!/bin/bash
    until [ /server/logs/latest.log | grep -oq " Stopping server" ]
    do
    java -jar server.jar
    done

    Оператор until зацикливает скрипт до тех пор, пока в логе не появится надпись "Server stopping". Но сервер почему-то после стопа включается снова. Как быть?
     
  4. InterVi

    InterVi Старожил Пользователь

    Баллы:
    173
    Снова небезопасно. А если игрок напишет это в чат? Надо придумывать проверку.
    Код:
    #!/bin/bash
    until [grep -oq  "Stopping the server" /server/logs/latest.log]
    do
    java -jar server.jar
    done
     
  5. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Могу предложить ещё один костыль.
    При остановке сервера создаётся файл.
    В while(true) (при каждом завершении процесса сервера) проверяется наличие этого файла. Если есть - выходим из цикла.
    И до цикла (при запуске скрипта) можно ещё этот файл удалять, если существует, конечно.

    Вариант не идеальный, но, по моему, это гораздо лучше, чем постоянно проверять вывод консоли и лог-файл.
     
  6. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Юзать врапер и не ипать свой мозг.
     
  7. PYRO

    PYRO Активный участник Пользователь

    Баллы:
    78
    что там придумывать, попросту чекать регуляркой по началу строки
    Код:
    grep ^\\[ logs/latest.log|cut -d " " -f4,5|grep ^CONSOLE:\\sStopping$
     
    Последнее редактирование: 18 авг 2016
  8. InterVi

    InterVi Старожил Пользователь

    Баллы:
    173
    игрок точно не пропишет потом это в чат? вот в чём уязвимость
    CONSOLE: Stopping
     
  9. PYRO

    PYRO Активный участник Пользователь

    Баллы:
    78
    Игрок не сможет писать в консоль на таком уровне. Регулярка ловит начало строки(иначе говоря - ищет источник сообщения), и строку: <Pyro> CONSOLE: Stopping проигнорирует.
    Натрави команду на лог-файл сервера, увидишь, найдет лишь одно сообщение об остановке, как бы там игроки ни писали в чат.
    Команду чуть исправил, куда-то пропал пробел, пока вставлял на сайт.
     
  10. SaratovGermania

    SaratovGermania Участник

    Баллы:
    31
    Имя в Minecraft:
    Hermanius
    а нельзя просто заказать в интернете?
     
  11. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Все готовое уже есть, ртулкит называется - рестарт, заморозка, стоп сервера вместе с врапером. Но дурачки же не идут легким путем.
     
  12. HOSTIAN

    HOSTIAN Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    HOSTIAN
    Вот код , написал , может поможет тебе . В любой папке создаешь core.sh потом . Для старта core.sh (start либо stop либо status). Пример : core.sh start
    Код:
    #!/bin/sh
    ### BEGIN INIT INFO
    
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Description: Autostart
    ### END INIT INFO
    
    #######################################################
    # Скрипт создан Hostian.ru
    ###################################
    #######################################################
    
    # user
    user="root"
    # Папка где скрипт лежит сюда пишите
    folder="/home/"
    # Скрипт
    startscript="core.jar"
    
    #######################################################
    #                   Autostart Script                  #
    #######################################################
    case "$1" in
    start)
            su $user -c "java -jar $folder$startscript"
            ;;
    stop)
            su $user -c "jps -v | grep "$startscript"| awk '{print $1}'|xargs kill -9"
            ;;
    status)
            su $user -c "
    jps -v | grep "$startscript"| grep -v "$startscript"| awk '{print $1}'
    "
            ;;
    *)
            echo "Bad usage!"
            echo "$0 start > Start Server"
            echo "$0 stop > Stop Server"
            echo "$0 status > Display Server Status"
            exit 1
    ;;
    esac
    exit 0
     
    Последнее редактирование: 28 фев 2017
  13. Neosha

    Neosha Активный участник Пользователь

    Баллы:
    66
    Мой костыль, пользуйтесь на здоровье:

    Код:
    CORE="название ядра"
    MIN="выделяемая память при старте"
    MAX="максимальная выделяемая память"
    PORT="номер порта"
    ID="java -Dfile.encoding=utf-8 -Xincgc -server -Xms$MIN -Xmx$MAX -jar $CORE nogui -o true"
    while true
    do
        kill -9 $(lsof -i -P -n | grep "TCP" | grep "$PORT" | awk '{print $2}')
        $ID
        echo "Для остановки нажмите Ctrl + C!"
        echo "Перезагрузка:"
        for i in 5 4 3 2 1
        do
            echo "$i..."
            sleep 1
        done
        echo "Перезагрузка пошла!"
    done
     

Поделиться этой страницей