Como passar o comando para executar o aplicativo java usando um arquivo em lote

0

Ele esta meu parece um pouco básico e simples, mas eu nunca fiz isso antes.

Eu tenho esse servidor de minecraft e ele inicia com um arquivo em lote contendo:

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

Agora eu realmente quero criar um lote que pare o servidor. No cmd eu posso simplesmente digitar stop e o servidor pára. Como posso passar este comando para o aplicativo java em execução.

Algum pseudo código:

java craftbukkit-1.5.1-R0.1.jar stop

Eu realmente não tenho ideia. Eu procurei na internet Mas eu só encontro tutoriais sobre como fazer um start.bat.

Um link com um tutorial também me deixará feliz. Acontece que não consigo encontrar um bom tutorial que cubra isso.

Agora encontrei este script para o 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..."5'
    screen -S $SESSIONNAME -p 0 -X eval 'stuff "save-off"5'
    screen -S $SESSIONNAME -p 0 -X eval 'stuff "save-all"5'
    sync
}

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

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

Mas o meu servidor está executando uma máquina WindowsXP, então existe uma maneira de fazer o acima no Windows? Eu não tenho ideia.

    
por botenvouwer 08.04.2013 / 20:55

3 respostas

1

Eu encontrei uma maneira de fazer isso com o AutoHotkey:

Etapa 1: faça o download do autohotkey.exe

Passo 2: Instalar > autohotkey.exe

Passo 3: Escreva este script e chame-o (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
}

Passo 4: Coloque title run-minecraft na frente do seu start.bat

Passo 5: Clique esquerdo (stop.ahk) e selecione o script de compilação

Etapa 6: execute o aplicativo com o gerenciador de tarefas do Windows

    
por 09.04.2013 / 10:50
0

Se você quer apenas matar o processo, você pode fazer algo parecido com isso no seu script bash:

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

Você pode substituir "java" por um identificador mais específico.

Se você quiser interromper o processo mais facilmente, terá que implementar algo como um ouvinte de soquete. Nesse caso, você poderia criar um aplicativo cliente simples para enviar uma mensagem ao aplicativo em execução, através de uma porta, informando que ele se desligasse. Para mais informações, consulte este tutorial .

    
por 08.04.2013 / 21:04
0

O Taskkill deve resolver o problema, consulte o link . Mas eu acho que a parte complicada seria descobrir qual processo java matar e eu acho que o jps pode ajudar. Mais informações aqui link

    
por 08.04.2013 / 21:05