분리된 화면에 텍스트 입력 보내기

분리된 화면에 텍스트 입력 보내기

unRAID 서버에서 Minecraft 서버를 실행하려고 합니다.

서버는 쉘에서 실행되고 입력을 기다립니다. 이를 중지하려면 "stop"을 입력하고 Enter 키를 누릅니다. 그러면 세상이 저장되고 정상적으로 종료되며 다시 셸로 돌아옵니다. NAS 상자에 텔넷으로 연결하여 실행하면 모든 것이 작동하지만 상자에서 직접 실행하고 싶습니다.

이전의 첫 번째 시도는 다음과 같습니다.

#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 및 모든 세계 파일 등이 있는 폴더입니다. 해당 화면 줄을 직접 입력하면 화면에서 설정이 분리되고 서버가 시작됩니다. 스크립트에서 해당 줄을 실행하면 화면이 설정되지 않는 것 같습니다.

서버를 중지하려면 STOP을 "입력"하고 Enter 키를 눌러야 합니다. 내 방법은

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

"minecraft" 화면에 STOP 및 ENTER 텍스트를 보냅니다. 하지만 명령줄에 직접 입력해도 작동하지 않습니다. 그러나 "screen -r"을 사용하면 서버가 실행 중인 화면으로 이동하여 "stop"을 입력하면 제대로 종료됩니다.

원격으로 로그인해서 수동으로 하면 서버는 잘 돌아가는데, 원격 컴퓨터에서 연결하지 않고 그냥 실행하면 됩니다.

답변1

나는 적어도 문제의 일부, 즉 그 stop부분이 작동하지 않는 이유를 해결할 수 있습니다. 실험적으로 분리 모드( )에서 Screen 세션을 시작하면 screen -d -m창이 선택되지 않으므로 나중에 전송된 입력이 screen -X stuff손실됩니다. 키 입력이 창 0( )으로 전송되도록 명시적으로 지정해야 합니다 -p 0. 그럼에도 불구하고 어떤 이유로 해당 Screen 세션에서 다른 창을 만드는 경우를 대비해 좋은 생각입니다.

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

(화면은 ^M키를 누르면 전송되는 문자인 control-M으로 변환됩니다 Enter.)

스크립트에서 세션을 시작할 때 발생하는 문제는 unMENU와 관련이 있을 수 있습니다.

답변2

먼저 개행 문자를 쉽게 입력하는 방법에 대한 참고 사항:

$()구성은 명령 출력에서 ​​개행을 제거하여 출력 행을 다른 프로그램의 인수로 사용할 수 있다는 점에 유의하십시오. 이로 인해 예기치 않은 동작이 발생할 수 있습니다. 이 경우에는 Enter키 입력에 해당하는 내용을 구체적으로 보내려고 한다고 가정합니다 . 보내는 캐리지 리턴 문자는 \r스트라이프되지 않지만 추가 명령 없이 해당 문자를 입력할 수 있는 몇 가지 더 쉬운 방법이 있습니다.

  1. 큰따옴표 안에 일반 개행 문자를 넣을 수 있습니다.

    screen -S minecraft -X stuff "stop
    "
    
  2. Ctrl또는 + 시퀀스를 사용하여 터미널 라인에 문자를 입력할 수 있습니다 v Enter. 이는 ^M터미널에서 와 유사 하지만 특수 개행 문자입니다.

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

둘째, 불규칙한 화면 동작에 대한 참고 사항입니다. (Gilles의 설명과 해결책)

화면에 연결되지 않은 화면 세션의 입력을 수락하는 데 문제가 있습니다. 실행하면 실패합니다.

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

하지만 다음을 실행하면 작동합니다.

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

tmux마지막으로 성능이 더 좋은 방법을 대신 사용할 수 있습니다 screen.

GNU-Screen은 항상사실은터미널 멀티플렉서는 수년 동안 사용되어 왔지만 개발은 오랫동안 중단되었으며 버그와 단점은 수정되지 않았습니다. Tmux는 활발하게 개발 중이며 화면이 건드릴 수 없는 많은 기능을 포함하고 있으며 기본 동작이 더 직관적입니다. 그리고 더 나은 실적을 가지고 있습니다. 코드를 변환하는 방법은 다음과 같습니다.

# 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"

답변3

오래된 글을 파헤쳐서 죄송합니다만, 비슷한 문제가 생겼을 때 이 정보를 활용하시면 도움이 될 것 같습니다. Bash 스크립트에서 화면 명령을 보내는 방법에 대한 많은 질문이 있습니다. 고양이 가죽을 벗기는 것처럼 할 수도 있지만 저는 이 방법을 좋아합니다. 이것을 사용하면 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"
...

이것은 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 !@#$%^&*()<>?This string will work!"

관련 정보