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


44

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'을 입력하면 제대로 종료됩니다.

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


이것이 옳아 보인다 . 스크립트의 전체 내용은 무엇이며 어떻게 실행합니까? 출력을 생성합니까? screen시작하지 못했다 는 것을 어떻게 알 수 있습니까? 추가 시도 set -x(바로 후 스크립트의 상단 #!선)과 스크립트를 실행할 때 추적 결과를보고한다.
Gilles 'SO- 악마 그만해'

내가 생각 스크립트 : 내가 직접 그것을 입력하면 화면 명령이 작동의 전체 내용이다, 그래서 내 주요 문제는 정지 부분은
리처드 수직

“스크립트 내에서 해당 줄을 실행하면 화면을 설정하지 않는 것 같습니다”라고 썼습니다. 시작 부분이 작동합니까? 그렇지 않은 경우 첫 번째 의견을 참조하십시오.
Gilles 'SO- 악마 중지'

비 MENU 사용자 스크립트로 실행하려고합니다. 정확한 화면 명령을 가진 사용자 스크립트가 있으면 아무 일도 일어나지 않습니다. 화면 명령을 텔넷 창에 입력하면 예상대로 화면에서 서버가 시작됩니다. 따라서 unMENU 사용자 스크립트가 처리되는 방식에서 이해하지 못하는 차이가 있다고 생각합니다.
richard plumb

이제 우리는 어딘가로 가고 있습니다. unMENU 사용 방법에 대한 정보로 질문을 업데이트하십시오. 그리고 두 줄을 추가하려고 할 #!/bin/bashset -x스크립트의 상단에, 우리에게 스크립트의 추적 출력을 보여줍니다. 출력이 어디로 가는지 알아 보려면 unMENU 설명서를 참조해야 할 수도 있습니다.
Gilles 'SO- 악마 그만해'

답변:


40

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

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

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

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


1
아름답고 훌륭하게 작동합니다 (적어도 명령 줄에서 메뉴를 벗어난 사람들을 찌를 것입니다). 이것은 꽤 많은 사람들을 던진 것으로 보이며 처음으로 구체적인 해결책을 보았습니다. 난 그냥 당신을 투표하기에 충분한 포인트가 있었으면 좋겠다 : D
richard plumb

젠장 s ** t! 화면을 다시 연결하지 않고 이미 연결된 상태에서도 작동합니다! 시스템의 다른 앱에서 간단한 앱으로 명령을 보내는 가장 좋은 방법은 무엇입니까? 감사! :)
Grzegorz Wierzowiecki

나는 항상 내 스크린 세션에 여러 개의 (이름이 지정된) 창을 계획하고 항상 이름별로 창을 선택하기 때문에이 문제가 없었습니다.
Ekevoo

매뉴얼, 참조 : -X 지정된 명령을 실행중인 화면 세션으로 보냅니다. 여러 개의 스크린 세션이 실행중인 경우 -S 옵션을 사용하여 스크린 세션을 지정할 수 있습니다. -d 또는 -r 옵션을 사용하여 화면에 연결되거나 분리 된 화면 세션 만 찾도록 지시 할 수 있습니다. 세션이 비밀번호로 보호되어 있으면이 명령이 작동하지 않습니다.
KrisWebDev

3
이것은 나를 위해 작동하지 않습니다. 화면을 만든 screen -d -m -S hi다음 실행 screen -S hi -p 0 -X stuff "cd <some_directory>^M"하고 결과를 얻지 못합니다. "cd <some_directory> ^ M"을 문자열로 보내고 "^ M"을 Enter 키로 해석하지 않습니다 ...
Tanner Strunk

23

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

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

screen -r을 사용하여 수동으로 전환하면 화면을 볼 수 있으며 텍스트가 전혀 입력되지 않습니다. 캐리지 리턴이 실패하더라도 여전히 '중지'를 입력해야합니다. 그러나 아무것도
richard plumb

그때 한 줄에 화면 -r있는 스크립트를 가지고 있고, -X 물건 "정지 ^ M은"다음 서버를 중지 않는 화면뿐만 아니라 '옵션 R가 알 수없는 오류'로 불평
리처드 수직

여기에서 스크린 세션을 만든 다음 위의 명령을 사용하여 테스트했으며 완벽하게 작동합니다. ?를 사용하여 화면 세션에 연결할 수 screen -d -RR minecraft있습니까?
Caleb

예, 화면에 연결됩니다. 화면 -r .. 멈춤, 화면 -S minecraft -X 항목 "stop ^ M"을 시도한 다음 수동으로 화면 -r을 시도하면 화면에 '중지'텍스트가 있습니다.
리처드

나를 위해 작동합니다. 아마도 당신은 당신에게 펑키 한 것이 .screenrc있거나 그 이름으로 많은 defunkt 스크린 세션을 열어서 잘못된 데이터를 보내고 있습니까? screen -list?
Caleb

4

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

니스와 간결한 ... U & L에 오신 것을 환영합니다
eyoung100
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.