it-swarm-vi.com

gửi văn bản đầu vào đến một màn hình tách rời

Tôi đang cố gắng chạy một máy chủ minecraft trên máy chủ unRAID của mình.

Máy chủ sẽ chạy trong Shell, và sau đó ngồi đó chờ nhập liệu. Để ngăn chặn nó, tôi cần nhập 'stop' và nhấn enter, sau đó nó sẽ cứu thế giới và thoát ra một cách duyên dáng, và tôi trở lại Shell. Tất cả đều hoạt động nếu tôi chạy nó qua telnett vào hộp NAS, nhưng tôi muốn chạy trực tiếp trên hộp.

đây là những gì trước đây tôi đã có như một nỗ lực đầu tiên:

#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

MCunston là thư mục nơi tôi có Craftbukkit.jar và tất cả các tệp thế giới, v.v ... Nếu tôi nhập trực tiếp dòng màn hình đó, màn hình sẽ thiết lập tách ra và máy chủ khởi chạy. Nếu tôi thực thi dòng đó từ trong tập lệnh, nó dường như không thiết lập màn hình

để dừng máy chủ, tôi cần 'gõ' trong STOP và sau đó nhấn enter. Cách tiếp cận của tôi là

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

để gửi đến màn hình 'minecraft' văn ​​bản s-t-o-p và trả lại xe ngựa. Nhưng nó không hoạt động, ngay cả khi tôi gõ nó trực tiếp vào dòng lệnh. Nhưng nếu tôi 'screen -r' tôi có thể vào màn hình khi máy chủ đang chạy, sau đó gõ 'stop' và nó tắt đúng cách.

Máy chủ chạy tốt nếu tôi telnet và thực hiện thủ công, chỉ cần chạy nó mà không cần kết nối từ máy tính từ xa.

47
richard plumb

Tôi có thể giải quyết ít nhất một phần của vấn đề: tại sao phần stop không hoạt động. Thực nghiệm, khi bạn bắt đầu phiên Màn hình ở chế độ tách rời (screen -d -m), không có cửa sổ nào được chọn, vì vậy, đầu vào sau được gửi với screen -X stuff chỉ là mất. Bạn cần xác định rõ ràng rằng bạn muốn gửi tổ hợp phím đến cửa sổ 0 (-p 0). Dù sao đây cũng là một ý tưởng hay, trong trường hợp bạn tình cờ tạo các cửa sổ khác trong phiên Màn hình đó vì bất kỳ lý do gì.

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

(Dịch màn hình ^M để điều khiển-M là ký tự được gửi bởi Enter Chìa khóa.)

Vấn đề với việc bắt đầu phiên từ một tập lệnh có thể liên quan đến unMENU.

Đầu tiên, một lưu ý về việc dễ dàng nhập các dòng mới:

Chỉ cần một cái đầu là $() xây dựng các dòng mới từ đầu ra của lệnh để các dòng đầu ra có thể được sử dụng làm đối số cho các chương trình khác. Điều này có thể gây ra hành vi bất ngờ. Trong trường hợp này, tôi giả sử bạn đang cố gắng gửi tương đương Enter tổ hợp phím. Trong khi vận chuyển trở lại bạn đang gửi với \r Sẽ không bị sọc, có một số cách dễ dàng hơn để nhập ký tự đó mà không cần thêm lệnh.

  1. Bạn có thể đặt một dòng mới thường xuyên bên trong dấu ngoặc kép của bạn

    screen -S minecraft -X stuff "stop
    "
    
  2. Hoặc bạn có thể nhập ký tự trong một dòng thiết bị đầu cuối bằng cách sử dụng Ctrl+vEnter sự nối tiếp. Cái này sẽ trông giống như ^M trong thiết bị đầu cuối, nhưng đó là một ký tự dòng mới đặc biệt.

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

Thứ hai, Một lưu ý về hành vi màn hình thất thường. ( Giải thích và giải pháp của Gilles )

Màn hình có vấn đề với việc chấp nhận đầu vào cho một phiên màn hình chưa bao giờ được đính kèm. Nếu bạn chạy nó, nó sẽ thất bại:

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

Nhưng nếu bạn chạy nó, nó sẽ hoạt động:

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

Cuối cùng, bạn có thể sử dụng tmux hoạt động tốt hơn nhiều thay vì screen.

GNU-Screen đã là một bộ ghép kênh đầu cuối de-facto trong nhiều năm, nhưng nó đã không còn được phát triển và các lỗi và quirks không được sửa chữa . Tmux đang được phát triển tích cực, bao gồm nhiều tính năng mà màn hình không thể chạm vào và hành vi của nó ra khỏi hộp khá trực quan hơn. Ngoài ra, nó là tài liệu tốt hơn. Đây là cách bạn sẽ chuyển đổi mã của mình:

# 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

Tôi xin lỗi vì đã đào bài cũ này, nhưng điều này sẽ giúp tôi trong nỗ lực của mình khi thông tin này có sẵn tại thời điểm tôi gặp vấn đề tương tự. Có rất nhiều câu hỏi về cách gửi lệnh màn hình trong tập lệnh bash. Như với việc lột da mèo có thể được thực hiện, nhưng tôi thích cách này. Với điều này, bạn có thể gửi bất kỳ lệnh nào hoặc nói bất cứ điều gì chỉ bằng cách gọi hàm 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"
...

Đây là với 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