Saya mencoba menjalankan server minecraft di server unRAID saya.
Server akan berjalan di shell, dan kemudian duduk di sana menunggu input. Untuk menghentikannya, saya harus mengetik 'berhenti' dan tekan enter, dan kemudian itu akan menyelamatkan dunia dan keluar dengan anggun, dan saya kembali ke shell. Itu semua berfungsi jika saya menjalankannya melalui telnetting ke dalam kotak NAS, tetapi saya ingin menjalankannya langsung di kotak itu.
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' berhenti teks 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.
sumber
screen
gagal memulai? Coba tambahkanset -x
di bagian atas skrip (tepat setelah#!
baris) dan laporkan hasil penelusuran ketika Anda menjalankan skrip.#!/bin/bash
danset -x
di bagian atas skrip, dan tunjukkan kami jejak hasil dari skrip. Anda mungkin perlu mencari di dokumentasi unMENU untuk mengetahui ke mana perginya output itu.Jawaban:
Saya dapat memecahkan setidaknya sebagian dari masalah: mengapa
stop
bagian itu tidak berfungsi. Secara eksperimental, ketika Anda memulai sesi Layar dalam mode terlepas (screen -d -m
), tidak ada jendela yang dipilih, sehingga input yang dikirim nantiscreen -X stuff
hilang begitu saja. Anda harus secara eksplisit menentukan bahwa Anda ingin mengirim penekanan tombol ke jendela 0 (-p 0
). Ini adalah ide yang baik, jika Anda kebetulan membuat windows lain di sesi Layar itu untuk alasan apa pun.(Layar menerjemahkan
^M
ke kontrol-M yang merupakan karakter yang dikirim oleh Entertombol.)Masalah dengan memulai sesi dari skrip kemungkinan terkait dengan unMENU.
sumber
screen -d -m -S hi
dan kemudian menjalankanscreen -S hi -p 0 -X stuff "cd <some_directory>^M"
dan tidak mendapatkan apa-apa sebagai hasilnya ... hanya mengirimkan "cd <some_directory> ^ M" sebagai string dan tidak mengartikan "^ M" sebagai masukkan kunci ...Pertama, catatan tentang cara memasukkan baris dengan mudah:
Hanya kepala bahwa
$()
konstruk 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 Enterkeystroke. Meskipun carriage return yang Anda kirim\r
tidak akan bergaris, ada beberapa cara yang lebih mudah untuk memasukkan karakter itu tanpa perlu perintah tambahan.Anda dapat menempatkan baris baru reguler di dalam tanda kutip ganda Anda
Atau Anda dapat memasukkan karakter di baris terminal menggunakan urutan Ctrl+ v Enter. Ini akan terlihat seperti
^M
di terminal, tetapi ini merupakan karakter baris baru khusus.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:
Tetapi jika Anda menjalankan ini akan berhasil:
Terakhir, Anda bisa menggunakan jauh lebih baik berperilaku
tmux
bukanscreen
.GNU-Screen telah menjadi terminal multiplexer de-facto selama bertahun-tahun, tetapi telah lama berhenti dikembangkan dan bug dan keanehan 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:
sumber
screen -d -RR minecraft
?.screenrc
atau Anda memiliki banyak sesi layar defunkt terbuka dengan nama itu dan jadi Anda mengirim data ke yang salah?screen -list
?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.
Ini dengan ssh!
sumber