Он кажется мне немного простым и простым, но я никогда не делал этого раньше.

У меня есть этот сервер Minecraft, и он запускается с командным файлом, содержащим:

java -Xms1012M -Xmx1012M -jar craftbukkit-1.5.1-R0.1.jar -o true
PAUSE

Теперь я действительно просто хочу создать пакет, который останавливает сервер. В CMD я могу просто ввести стоп, и сервер останавливается. Как я могу передать эту команду запущенному Java-приложению.

Некоторый псевдокод:

java craftbukkit-1.5.1-R0.1.jar stop

Я действительно понятия не имею,. Я искал в Интернете, но я нахожу только учебники о создании start.bat.

Ссылка с обучающей программой также сделает меня счастливым. Просто так получилось, что я не могу найти хороший учебник, который охватывает это.

Теперь я нашел этот скрипт для Linux:

 #!/bin/bash

    # Made by Devils Child.
    ##############################################################
    DIRECTORY='/home/minecraft'
    SESSIONNAME='minecraftserverscreen'
    JARFILE='craftbukkit.jar'
    WORLDNAME='world'
    NETHERNAME='world_nether'
    SKYNAME='world_skylands'
    ENDNAME='world_the_end'
    ##############################################################

start()
{
    SCREENID=$(screen -ls | grep -w $SESSIONNAME | cut -f 2)
    if [ $SCREENID ]; then
        echo "Minecraft is already running."
    else
        echo "Starting Minecraft server..."
        screen -dmS $SESSIONNAME java -Xms768M -Xmx768M -jar $JARFILE nogui
    fi
}

stop()
{
    SCREENID=$(screen -ls | grep -w $SESSIONNAME | cut -f 2)
    if [ $SCREENID ]; then
        echo "Stopping Minecraft server..."
        screen -S $SESSIONNAME -p 0 -X stuff "`printf "stop\r"`"
        while screen -ls | grep $SESSIONNAME > /dev/null
        do
            sleep 0.1
        done
    else
        echo "Minecraft is not running."
    fi
}

restart()
{
    echo "Restarting Minecraft server..."
    stop > /dev/null && start > /dev/null
}

saveoff()
{
    screen -S $SESSIONNAME -p 0 -X eval 'stuff "say Starting backup..."\015'
    screen -S $SESSIONNAME -p 0 -X eval 'stuff "save-off"\015'
    screen -S $SESSIONNAME -p 0 -X eval 'stuff "save-all"\015'
    sync
}

saveon()
{
    screen -S $SESSIONNAME -p 0 -X eval 'stuff "save-on"\015'
    screen -S $SESSIONNAME -p 0 -X eval 'stuff "say Backup complete."\015'
}

backup()
{
    echo "Creating backup of '$WORLDNAME', '$NETHERNAME', '$SKYNAME' and '$ENDNAME'..."
    saveoff
    sleep 5
    mkdir -p backups
    tar cfv "backups/NEW.tar" $WORLDNAME $NETHERNAME $SKYNAME $ENDNAME > /dev/null
    mv "backups/NEW.tar" "backups/$(date +"%m-%d-%Y_%H.%M.%S").tar"
    saveon
}

restore()
{
    echo "Restoring '$WORLDNAME', '$NETHERNAME', '$SKYNAME' and '$ENDNAME'..."
    stop > /dev/null
    rm -r $WORLDNAME
    rm -r $NETHERNAME
    rm -r $SKYNAME
    rm -r $ENDNAME
    tar xfv "backups/$(ls backups -t | head -1 | grep ".tar")" > /dev/null
    start > /dev/null
}

cd $DIRECTORY

case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        restart
    ;;
    backup)
        backup
    ;; 
    restore)
        restore
    ;;
    *)
        echo "Usage: ${0} {start|stop|restart|backup|restore}"
        exit 2
esac
exit 0

Но мой сервер работает под управлением WindowsXP, так есть ли способ сделать выше в Windows? Я понятия не имею.

3 ответа3

1

Я нашел способ сделать это с AutoHotkey:

Шаг 1: Загрузить-> autohotkey.exe

Шаг 2: Установить-> autohotkey.exe

Шаг 3: Напишите этот скрипт и назовите его (stop.ahk):

SetTitleMatchMode, 2      ; mode 2 = title only needs to contain string to match
SetKeyDelay, 0            ; set key delay to minimal
#WinActivateForce         ; automatically use more forceful methods
IfWinExist, run-minecraft ; check if there is a cmd window with this title
{                         ; send the commands
    ControlSend, ,say Server will shutdown in 10 seconds, run-minecraft
    ControlSend, ,{enter}
    sleep, 9999
    ControlSend, ,stop, run-minecraft
    ControlSend, ,{Enter}, run-minecraft
    return
}

Шаг 4: Поместите title run-minecraft перед вашим start.bat

Шаг 5: Щелкните левой кнопкой мыши (stop.ahk) и выберите сценарий компиляции

Шаг 6: запустить приложение с помощью диспетчера задач Windows

0

Если вы просто хотите убить процесс, вы можете сделать что-то вроде этого в вашем скрипте bash:

ps -ef | grep java | awk '{print$2}' | xargs -i kill {}

Вы можете заменить java более конкретным идентификатором.

Если вы хотите остановить процесс более изящно, вам придется реализовать что-то вроде прослушивателя сокетов. В этом случае вы можете создать простое клиентское приложение для отправки сообщения в работающее приложение через порт с указанием выключить себя. Для получения дополнительной информации см. Этот учебник.

0

Taskkill должен сделать трюк, см http://technet.microsoft.com/en-us/library/bb491009.aspx. Но я думаю, что сложнее было бы выяснить, какой Java-процесс убить, и я думаю, что jps может помочь. Более подробная информация здесь http://yannickloriot.com/2012/08/kill-a-java-process-from-the-command-line-or-a-bat-file/#sthash.t36Ff6C8.dpbs

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .