it-swarm-id.com

mengirim input teks ke layar terpisah

Saya mencoba menjalankan server minecraft di server saya yang belum dicetak.

Server akan berjalan di Shell, dan kemudian duduk di sana menunggu input. Untuk menghentikannya, saya harus mengetikkan 'berhenti' dan tekan enter, lalu itu akan menyelamatkan dunia dan keluar dengan anggun, dan saya kembali ke Shell. Itu semua berfungsi jika saya menjalankannya melalui telnetting ke kotak NAS, tapi saya ingin menjalankannya langsung di kotak.

inilah yang sebelumnya saya lakukan sebagai upaya pertama:

#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 adalah folder di mana saya memiliki Craftbukkit.jar dan semua file dunia, dll. Jika saya mengetikkan garis layar itu secara langsung, layar pengaturannya terlepas dan server diluncurkan. Jika saya mengeksekusi baris itu dari dalam skrip, sepertinya ia tidak mengatur layar

untuk menghentikan server, saya perlu 'mengetik' di STOP dan kemudian tekan enter. Pendekatan saya adalah

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

untuk mengirim ke layar 'minecraft' teks s-t-o-p dan carriage return. Tapi itu tidak berhasil, bahkan jika saya mengetiknya langsung ke baris perintah. Tetapi jika saya 'layar -r' saya bisa mendapatkan layar dengan server berjalan, kemudian ketik 'berhenti' dan dimatikan dengan benar.

Server berjalan dengan baik jika saya telnet dan melakukannya secara manual, hanya perlu menjalankannya tanpa terhubung dari komputer jarak jauh saya.

47
richard plumb

Saya dapat memecahkan setidaknya sebagian dari masalah: mengapa bagian stop tidak berfungsi. Secara eksperimental, ketika Anda memulai sesi Layar dalam mode terlepas (screen -d -m), tidak ada jendela yang dipilih, jadi input kemudian dikirim dengan screen -X stuff baru saja hilang. Anda harus secara eksplisit menentukan bahwa Anda ingin mengirim penekanan tombol ke jendela 0 (-p 0). Ini adalah ide yang bagus, jika Anda kebetulan membuat windows lain di sesi Layar itu untuk alasan apa pun.

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

(Layar menerjemahkan ^M to control-M yang merupakan karakter yang dikirim oleh Enter kunci.)

Masalah dengan memulai sesi dari skrip kemungkinan terkait dengan unMENU.

Pertama, catatan tentang cara memasukkan baris dengan mudah:

Hanya kepala bahwa $() membangun strip baris baru dari output perintah sehingga garis output dapat digunakan sebagai argumen untuk program lain. Ini dapat menyebabkan perilaku yang tidak terduga. Dalam hal ini saya menganggap Anda secara khusus mencoba mengirim yang setara dengan Enter keystroke. Saat kereta kembali, Anda mengirim _ \r tidak akan dilucuti, ada beberapa cara lebih mudah untuk memasukkan karakter itu tanpa perlu perintah tambahan.

  1. Anda dapat menempatkan baris baru reguler di dalam tanda kutip ganda Anda

    screen -S minecraft -X stuff "stop
    "
    
  2. Atau Anda dapat memasukkan karakter di baris terminal menggunakan Ctrl+vEnter urutan. Ini akan terlihat seperti ^M di terminal, tetapi itu adalah karakter baris baru khusus.

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

Kedua, Catatan tentang perilaku layar yang tidak menentu. ( Penjelasan dan solusi oleh Gilles )

Layar memiliki masalah dengan menerima input ke sesi layar yang belum pernah dilampirkan. Jika Anda menjalankan ini, itu akan gagal:

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

Tetapi jika Anda menjalankan ini akan berhasil:

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

Terakhir, Anda bisa menggunakan tmux yang berperilaku jauh lebih baik daripada screen.

GNU-Screen telah menjadi terminal multiplexer de-facto selama bertahun-tahun, tetapi telah lama berhenti dikembangkan dan bug dan kebiasaan tidak diperbaiki . Tmux sedang dalam pengembangan aktif, mencakup banyak fitur yang tidak dapat disentuh layar, dan perilakunya di luar kotak agak lebih intuitif. Juga, lebih baik didokumentasikan. Inilah cara Anda mengonversi kode Anda:

# 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

Saya minta maaf karena menggali posting lama ini, tetapi ini akan membantu saya dalam usaha saya seandainya informasi ini tersedia pada saat saya memiliki masalah yang sama. Ada banyak pertanyaan tentang cara mengirim perintah layar dalam skrip bash. Seperti halnya menguliti kucing ini mungkin dilakukan, tetapi saya suka cara ini. Dengan ini, Anda dapat mengirim perintah atau mengatakan apa pun hanya dengan memanggil fungsi 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"
...

Ini dengan 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