Posso risolvere almeno una parte del problema:perché il file stop
parte non funziona. Sperimentalmente, quando avvii una sessione Screen in modalità indipendente (screen -d -m
), nessuna finestra è selezionata, quindi l'input è stato successivamente inviato con screen -X stuff
è solo perso. Devi specificare esplicitamente che vuoi inviare i tasti premuti alla finestra 0 (-p 0
). Questa è comunque una buona idea, nel caso in cui ti capiti di creare altre finestre in quella sessione Screen per qualsiasi motivo.
screen -S minecraft -p 0 -X stuff "stop^M"
(Traduzione dello schermo ^M
a control-M che è il carattere inviato da Invio 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 $()
build rimuove le nuove righe dall'output di comando in modo che le righe di output possano essere utilizzate come argomenti per altri programmi. Ciò può causare un comportamento imprevisto. In questo caso presumo che tu stia specificamente cercando di inviare l'equivalente di Invio sequenza di tasti. Mentre il ritorno a capo stai inviando con \r
non verrà barrato, ci sono diversi modi più semplici per inserire quel carattere senza la necessità del comando aggiuntivo.
-
Puoi inserire una nuova riga normale all'interno delle virgolette
screen -S minecraft -X stuff "stop "
-
Oppure puoi inserire il carattere in una riga terminale usando Ctrl +v Invio 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 a una sessione dello schermo che non è mai stata collegata. Se lo esegui, avrà esito negativo:
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, potresti usare tmux
che si comporta molto meglio invece di screen
.
GNU-Screen è stato un di fatto multiplexer terminale per molti anni, ma ha smesso da tempo di essere sviluppato e bug e stranezze non vengono risolti. Tmux è in fase di sviluppo attivo, include molte funzionalità che lo schermo non può toccare e il suo comportamento fuori dagli schemi è piuttosto più intuitivo. Inoltre, è meglio documentato. Ecco come convertiresti il tuo 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"
Mi scuso per aver recuperato questo vecchio post, ma questo mi avrebbe aiutato nei miei sforzi se queste informazioni fossero state disponibili nel momento in cui ho avuto un problema simile. Ci sono molte domande su come inviare i comandi dello schermo in uno script bash. Come con la scuoiatura dei gatti, 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!"