Estou tentando executar um servidor minecraft no meu servidor unRAID.
O servidor será executado no shell e ficará sentado, aguardando a entrada. Para pará-lo, preciso digitar 'stop' e pressionar enter, para salvar o mundo e sair graciosamente, e estou de volta ao shell. Tudo funciona se eu executá-lo via telnet na caixa NAS, mas quero executá-lo diretamente na caixa.
isto é o que eu tive anteriormente como primeira tentativa:
#define USER_SCRIPT_LABEL Start Minecraft server
#define USER_SCRIPT_DESCR Start minecraft server. needs sde2 mounted first
cd /mnt/disk/sde2/MCunraid
screen -d -m -S minecraft /usr/lib/java/bin/java -Xincgc -Xmx1024M -jar CraftBukkit.jar
MCunraid é a pasta na qual eu tenho o Craftbukkit.jar e todos os arquivos do mundo etc. Se eu digitar essa linha de tela diretamente, a tela será configurada desanexada e o servidor será iniciado. Se eu executar essa linha de dentro do script, não parece configurar uma tela
para parar o servidor, preciso 'digitar' em STOP e pressionar enter. Minha abordagem foi
screen -S minecraft -X stuff "stop $(echo -ne '\r')"
para enviar para a tela 'minecraft' o texto para e um retorno de carro. Mas isso não funciona, mesmo que eu o digite diretamente na linha de comando. Mas se eu 'screen -r' puder acessar a tela com o servidor em execução, digite 'stop' e ele será encerrado corretamente.
O servidor funcionará bem se eu fizer o telnet e fazê-lo manualmente, só preciso executá-lo sem estar conectado no meu computador remoto.
fonte
screen
não conseguiu iniciar? Tente adicionarset -x
na parte superior do script (logo após a#!
linha) e relate a saída do rastreio ao executar o script.#!/bin/bash
eset -x
na parte superior do script e mostre-nos a saída de rastreamento do script. Pode ser necessário procurar na documentação unMENU para descobrir para onde vai essa saída.Respostas:
Posso resolver pelo menos parte do problema: por que a
stop
parte não está funcionando? Experimentalmente, quando você inicia uma sessão de Tela no modo desanexado (screen -d -m
), nenhuma janela é selecionada; portanto, as entradas enviadas posteriormentescreen -X stuff
são perdidas. Você precisa especificar explicitamente que deseja enviar as teclas pressionadas para a janela 0 (-p 0
). De qualquer forma, é uma boa ideia, caso você crie outras janelas nessa sessão da Tela por qualquer motivo.(A tela é convertida
^M
para control-M, que é o caractere enviado pela Entertecla.)O problema ao iniciar a sessão a partir de um script provavelmente está relacionado à unMENU.
fonte
screen -d -m -S hi
e, em seguida, corroscreen -S hi -p 0 -X stuff "cd <some_directory>^M"
e não recebo nada como resultado ... ele envia "cd <some_directory> ^ M" como uma string e não interpreta "^ M" como tecla enter ...Primeiro, uma observação sobre como inserir facilmente novas linhas:
Apenas um aviso de que a
$()
construção retira novas linhas da saída do comando para que as linhas de saída possam ser usadas como argumentos para outros programas. Isso pode causar comportamento inesperado. Nesse caso, suponho que você esteja tentando enviar o equivalente ao Enterpressionamento de tecla. Embora o retorno de carro com o qual você está enviando\r
não seja listrado, existem várias maneiras mais fáceis de inserir esse caractere sem a necessidade de um comando extra.Você pode colocar uma nova linha regular entre aspas duplas
Ou você pode inserir o caractere em uma linha de terminal usando a sequência Ctrl+ v Enter. Será algo parecido
^M
com o terminal, mas é um caractere de nova linha especial.Em segundo lugar, uma observação sobre o comportamento irregular da tela. ( Explicação e solução de Gilles )
Tela tem um problema ao aceitar entrada para uma sessão de tela que nunca foi anexada. Se você executar isso, haverá uma falha:
Mas se você executar isso, funcionará:
Por fim, você poderia usar o comportamento muito melhor em
tmux
vez descreen
.O GNU-Screen é um multiplexador de terminal de fato há muitos anos, mas há muito deixa de ser desenvolvido e bugs e peculiaridades não estão sendo corrigidos. O Tmux está em desenvolvimento ativo, inclui muitos recursos que a tela não pode tocar e seu comportamento imediato é bastante mais intuitivo. Além disso, é melhor documentado. Veja como você converteria seu código:
fonte
screen -d -RR minecraft
?.screenrc
tela ou tenha várias sessões de tela abertas com esse nome e esteja enviando dados para a pessoa errada?screen -list
?Peço desculpas por desenterrar este post antigo, mas isso teria me ajudado em meus empreendimentos se essas informações estivessem disponíveis no momento em que tive um problema semelhante. Há muitas perguntas sobre como enviar comandos de tela em um script bash. Como na pele de um gato, isso pode ser feito, mas eu gosto dessa maneira. Com isso, você pode enviar qualquer comando ou dizer qualquer coisa apenas chamando a função say_esta função.
Isso é com ssh!
fonte