분리 된 화면에 텍스트 입력 보내기 server. needs sde2 mounted

UNRAID 서버에서 마인 크래프트 서버를 실행하려고합니다.

서버는 셸에서 실행 된 다음 입력 대기 상태로 앉아 있습니다. 중지하려면 ‘stop’을 입력하고 Enter 키를 누른 다음 세상을 구하고 정상적으로 종료하면 껍질로 돌아갑니다. Telneting을 통해 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에 ‘type’을 입력 한 다음 Enter 키를 눌러야합니다. 내 접근 방식은

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

‘마인 크래프트’화면에 텍스트 중지 및 캐리지 리턴을 보냅니다. 그러나 명령 줄에 직접 입력해도 작동하지 않습니다. 그러나 ‘screen -r’이면 서버가 실행중인 상태에서 화면에 도달 한 다음 ‘stop’을 입력하면 제대로 종료됩니다.

텔넷으로 연결하고 수동으로 수행하면 서버가 제대로 실행됩니다. 원격 컴퓨터에 연결하지 않고 서버를 실행하면됩니다.



답변

문제의 적어도 일부를 해결할 수 있습니다 stop. 부품이 작동하지 않는 이유 . 실험적으로 분리 모드 ( screen -d -m) 에서 스크린 세션을 시작하면 창이 선택되지 않으므로 나중에 전송 된 입력 screen -X stuff은 손실됩니다. 키 입력을 창 0 ( -p 0) 으로 보내도록 명시 적으로 지정해야합니다 . 어떤 이유로 든 해당 화면 세션에서 다른 창을 만드는 경우에 대비하여이 방법을 사용하는 것이 좋습니다.

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

(화면 ^MEnter키로 전송 된 문자 인 control-M으로 변환 됩니다 .)

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


답변

먼저, 개행을 쉽게 입력하는 것에 대한 참고 사항 :

것을 그냥 머리까지 $()출력 라인이 다른 프로그램에 대한 인수로 사용할 수 있도록 구조가 명령의 출력에서 줄 바꿈을 제거합니다. 예기치 않은 동작이 발생할 수 있습니다. 이 경우에는 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"

답변

이 오래된 게시물을 파고 드려 죄송하지만, 비슷한 문제가 발생했을 때이 정보를 사용할 수있게함으로써 저의 노력에 도움이 될 것입니다. 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!"