Saya dapat memecahkan setidaknya sebagian dari masalah:mengapa stop
bagian tidak bekerja. Secara eksperimental, saat Anda memulai sesi Layar dalam mode terpisah (screen -d -m
), tidak ada jendela yang dipilih, jadi masukan nanti dikirim dengan screen -X stuff
hilang begitu saja. Anda perlu menentukan secara eksplisit bahwa Anda ingin mengirim penekanan tombol ke jendela 0 (-p 0
). Ini adalah ide yang bagus, jika Anda kebetulan membuat jendela lain di sesi Layar itu karena alasan apa pun.
screen -S minecraft -p 0 -X stuff "stop^M"
(Terjemahan layar ^M
ke control-M yang merupakan karakter yang dikirim oleh Enter kunci.)
Masalah saat memulai sesi dari skrip kemungkinan terkait dengan unMENU.
Pertama, catatan tentang cara memasukkan baris baru dengan mudah:
Perhatikan bahwa $()
membangun strip baris baru dari output perintah sehingga baris 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. Sementara carriage return Anda mengirim dengan \r
tidak akan bergaris, ada beberapa cara yang lebih mudah untuk memasukkan karakter tersebut tanpa memerlukan perintah tambahan.
-
Anda dapat menempatkan baris baru biasa di dalam tanda kutip ganda Anda
screen -S minecraft -X stuff "stop "
-
Atau Anda dapat memasukkan karakter di baris terminal menggunakan Ctrl +v Masuk urutan. Ini akan terlihat seperti
^M
di terminal, tetapi ini 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 bermasalah saat menerima input ke sesi layar yang tidak pernah dilampirkan. Jika Anda menjalankan ini 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 dapat menggunakan tmux
yang berperilaku jauh lebih baik bukannya screen
.
GNU-Screen telah menjadi de-facto multiplexer terminal selama bertahun-tahun, tetapi sudah lama berhenti dikembangkan dan bug serta kebiasaan tidak diperbaiki. Tmux sedang dalam pengembangan aktif, menyertakan banyak fitur yang tidak dapat disentuh layar, dan perilakunya di luar kotak agak lebih intuitif. Juga, lebih baik didokumentasikan. Inilah cara 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"
Saya minta maaf telah menggali posting lama ini, tetapi ini akan membantu saya dalam upaya saya seandainya informasi ini tersedia pada saat saya mengalami masalah serupa. Ada banyak pertanyaan tentang cara mengirim perintah layar dalam skrip bash. Seperti menguliti kucing, ini mungkin dilakukan, tapi saya suka cara ini. Dengan ini, Anda dapat mengirim perintah apa pun atau mengucapkan 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!"