it-swarm.it

invio di input di testo a uno schermo separato

Sto cercando di eseguire un server Minecraft sul mio server unRAID.

Il server verrà eseguito in Shell, quindi rimarrà lì in attesa di input. Per fermarlo, devo digitare 'stop' e premere invio, quindi salverà il mondo e uscirà con grazia, e sono tornato in Shell. Funziona tutto se lo eseguo tramite telnetting nella casella NAS, ma voglio eseguirlo direttamente sulla casella.

questo è quello che ho avuto in precedenza come primo tentativo:

#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 è la cartella in cui ho Craftbukkit.jar e tutti i file del mondo, ecc. Se scrivo direttamente quella linea dello schermo, lo schermo si configura e il server si avvia. Se eseguo quella riga all'interno dello script, non sembra impostare uno schermo

per arrestare il server, devo "digitare" in STOP e quindi premere invio. Il mio approccio è stato

screen -S minecraft -X stuff "stop $(echo -ne '\r')"

per inviare allo schermo 'minecraft' il testo s-t-o-p e un ritorno a capo. Ma ciò non funziona, anche se lo scrivo direttamente sulla riga di comando. Ma se 'screen -r' posso arrivare allo schermo con il server in esecuzione, quindi digitare 'stop' e si spegne correttamente.

Il server funziona bene se telnet e lo faccio manualmente, devo solo eseguirlo senza essere collegato dal mio computer remoto.

47
richard plumb

Posso risolvere almeno una parte del problema: perché la parte stop non funziona. Sperimentalmente, quando si avvia una sessione dello schermo in modalità distaccata (screen -d -m), nessuna finestra è selezionata, quindi input inviato successivamente con screen -X stuff è appena perso. Devi specificare esplicitamente che desideri inviare i tasti alla finestra 0 (-p 0). Questa è comunque una buona idea, nel caso in cui ti capiti di creare altre finestre in quella sessione dello schermo per qualunque motivo.

screen -S minecraft -p 0 -X stuff "stop^M"

(Traduzione dello schermo ^M to control-M che è il personaggio inviato da Enter chiave.)

Il problema con l'avvio della sessione da uno script è probabilmente correlato a unMENU.

Innanzitutto, una nota su come inserire facilmente le nuove righe:

Solo un avvertimento che il costrutto $() elimina le nuove righe dall'output del comando in modo che le righe di output possano essere utilizzate come argomenti per altri programmi. Ciò può causare comportamenti imprevisti. In questo caso suppongo che tu stia specificamente cercando di inviare l'equivalente di Enter battitura. Durante il ritorno a capo che stai inviando con \r non verrà a strisce, ci sono molti modi più semplici per inserire quel personaggio senza la necessità del comando extra.

  1. È possibile inserire una nuova riga normale tra virgolette doppie

    screen -S minecraft -X stuff "stop
    "
    
  2. Oppure puoi inserire il carattere in una linea terminale usando il tasto Ctrl+vEnter sequenza. Questo sarà simile a ^M nel terminale, ma è un carattere speciale di nuova riga.

    screen -S minecraft -X stuff "stop^M"
    

In secondo luogo, una nota sul comportamento irregolare dello schermo. ( Spiegazione e soluzione di Gilles )

Lo schermo ha un problema con l'accettazione dell'input per una sessione dello schermo che non è mai stata allegata. Se lo esegui, non sarà riuscito:

screen -d -m -S minecraft zsh
screen -S minecraft -X stuff "stop^M"
screen -r minecraft

Ma se esegui questo funzionerà:

screen -d -m -S minecraft zsh
screen -r minecraft (then disconnect with Ctrl-a-d)
screen -S minecraft -X stuff "stop^M"
screen -r minecraft

Infine, è possibile utilizzare tmux molto meglio comportato anziché screen.

GNU-Screen è stato un moltiplicatore terminale di fatto per molti anni, ma ha smesso di svilupparsi da tempo e i bug e le stranezze non vengono corretti. Tmux è in fase di sviluppo attivo, include molte funzionalità che lo schermo non può toccare e il suo comportamento è immediatamente più intuitivo. Inoltre, è meglio documentato. Ecco come convertire il codice:

# Start new detached tmux session with a named window pane running the Java app
tmux new-session -d -n minecraft /usr/lib/Java/bin/Java [args]

# Send it keys to stop the mincraft server
tmux send-keys -t minecraft "stop^M"
25
Caleb

Mi scuso per aver scavato questo vecchio post, ma questo mi avrebbe aiutato nei miei sforzi se queste informazioni fossero state disponibili al momento in cui avevo un problema simile. Ci sono molte domande su come inviare comandi su schermo in uno script bash. Come per la pelle di gatto, questo può essere fatto, ma mi piace così. Con questo puoi inviare qualsiasi comando o dire qualsiasi cosa semplicemente chiamando la funzione say_this.

#!/bin/bash

say_this()
{
    screen -S minecraft -p 0 -X stuff "$1^M"
}

say_this "say Saving world"
say_this "save-off"
say_this "save-all"
...

Questo è con ssh!

#!/bin/bash

say_this()
{
    # Dont forget to set NAME or whatever
    ssh -p 8989 192.168.1.101 screen -S $NAME -p 0 -X stuff \"$1^M\"
}

say_this "say test"
say_this "say [email protected]#$%^&*()<>?This string will work!"
5
fuzzyfreak