it-swarm-tr.com

müstakil bir ekrana metin girişi gönderme

UnRAID sunucumda bir minecraft sunucusu çalıştırmaya çalışıyorum.

Sunucu Kabukta çalışacak ve daha sonra giriş için bekleyerek orada oturacaktır. Durdurmak için, 'stop' yazıp enter tuşuna basmam gerekiyor ve sonra dünyayı kurtaracak ve zarif bir şekilde çıkacak ve Shell'e geri döneceğim. NAS kutusuna telnetting ile çalıştırırsam, ancak doğrudan kutuda çalıştırmak istiyorsanız, tüm bu çalışır.

daha önce ilk denemem bu oldu:

#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 Craftbukkit.jar ve tüm dünya dosyaları vb. Var olan klasördür. Bu ekran satırını doğrudan yazarsam, ekran ayrılır ve sunucu başlatılır. Bu satırı komut dosyasından yürütürsem, bir ekran ayarlanmış gibi görünmüyor

sunucuyu durdurmak için STOP yazıp 'enter' tuşuna basmam gerekiyor. Benim yaklaşımım

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

'minecraft' ekranına s-t-o-p metnini ve satır başını göndermek için. Ancak doğrudan komut satırına yazsam bile bu işe yaramıyor. Ama eğer 'screen -r' sunucu çalışırken ekrana gelebilirsem, 'stop' yazıp düzgün kapanır.

Telnet içeriyor ve manuel olarak yapıyorsam sunucu iyi çalışıyor, sadece uzak bilgisayarımdan bağlanmadan çalıştırmanız gerekiyor.

47
richard plumb

Sorunun en azından bir kısmını çözebilirim: stop kısmı neden çalışmıyor? Deneysel olarak, ekran modunu bağımsız modda başlattığınızda (screen -d -m), pencere seçilmediğinden giriş daha sonra screen -X stuff kayboldu. Tuş vuruşlarını 0 penceresine göndermek istediğinizi açıkça belirtmeniz gerekir (-p 0). Bu Ekran oturumunda herhangi bir nedenle başka pencereler oluşturmanız durumunda, bu zaten iyi bir fikirdir.

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

(Ekran çevirisi ^M tarafından kontrol edilen M olan Enter Anahtar.)

Oturumun bir komut dosyasından başlatılmasındaki sorun büyük olasılıkla unMENU ile ilgilidir.

İlk olarak, yeni satırları kolayca girmeye ilişkin bir not:

$() construct komutunun çıkışından yeni satırları çıkardığı için çıkış satırlarının diğer programlar için bağımsız değişken olarak kullanılabilmesini sağlar. Bu beklenmeyen davranışlara neden olabilir. Bu durumda, özellikle Enter tuş. Satır başı dönerken \r çizgili olmaz, ekstra komuta gerek kalmadan o karakteri girmenin birkaç kolay yolu vardır.

  1. Çift tırnak içine düzenli bir satırsonu yerleştirebilirsiniz

    screen -S minecraft -X stuff "stop
    "
    
  2. Veya karakteri kullanarak bir terminal satırına girebilirsiniz. Ctrl+vEnter sıra. Bu ^M, ancak özel bir yeni satır karakteri.

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

İkincisi, düzensiz ekran davranışı hakkında bir not. ( Gilles tarafından açıklama ve çözüm )

Ekranın, hiçbir zaman eklenmemiş bir ekran oturumuna giriş kabul edilmesiyle ilgili bir sorunu var. Bunu çalıştırırsanız başarısız olur:

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

Ama bunu çalıştırırsanız işe yarayacak:

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

Son olarak, tmux yerine çok daha iyi davranmış screen kullanabilirsiniz.

GNU-Screen yıllardır fiili bir terminal çoklayıcıdır, ancak uzun süredir geliştirilmemiştir ve hatalar ve tuhaflıklar düzeltilmemektedir . Tmux aktif geliştirme aşamasındadır, ekranın dokunamayacağı birçok özellik içerir ve kutudan çıktığı davranış oldukça sezgiseldir. Ayrıca, daha iyi belgelenmiştir. Kodunuzu nasıl dönüştüreceğiniz aşağıda açıklanmıştır:

# 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

Bu eski gönderiyi bulduğum için özür dilerim, ancak bu bilgiler benzer bir sorun yaşadığım sırada mevcut olsaydı çabalarımda bana yardımcı olurdu. Bir bash betiğinde ekran komutlarının nasıl gönderileceği hakkında birçok soru vardır. Kedi derisinde olduğu gibi bu yapılabilir, ancak bu şekilde seviyorum. Bununla sadece say_this işlevini çağırarak herhangi bir komut gönderebilir veya herhangi bir şey söyleyebilirsiniz.

#!/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"
...

Bu ssh ile!

#!/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