Debian 9의 Bash Shell 스크립트와 통신하는 NodeJs 백엔드 서버를 사용하여 Minecraft 웹 인터페이스를 구축하고 싶습니다.
1: 다음 명령을 사용하여 새 Minecraft 서버를 만듭니다.screen -S server_name java -jar minecraft_server.jar
2: NodeJs 백엔드가 내 Shell 파일에 명령을 보내면 훌륭하게 작동합니다.screen -rd server_name -X stuff "whitelist add $3^M"
3: 플레이어 목록이 포함된 문자열이 서버 화면에 표시됩니다.
하지만 내 질문은 이 출력 문자열을 읽고 NodeJs 백엔드에서 읽도록 하는 방법입니다.
내 NodeJ 백엔드:https://hastebin.com/adosiwiqiq.coffeescript
내 쉘 스크립트:https://hastebin.com/acijegupud.bash
답변1
나는 이것이 작동한다고 생각합니다 screen
.fifo는 화면에 명령 출력을 가져옵니다., 그러나 "minecraft 쉘"이 이것을 지원할지는 의심스럽습니다.
그러나 이것은 "실행 가능"합니다 tmux
.
프로세스 상태/스택 추적
스택 추적
이것이 제대로 작동하려면 명령을 제공하는 프로그램이 관련 IO 작업에서 멈추는 지점을 감지해야 합니다. 한 가지 방법은 스택 추적을 실행하여 찾는 것입니다. 또한보십시오:명령이 실행 중인지 아니면 사용자 입력을 기다리고 있는지 어떻게 알 수 있나요?.
read
필요하기 전에 일시적으로 다른 위치에 걸릴 수 있으므로 약간 까다로울 수 있습니다 . 또한 걸린 시간과 파일 설명자를 기반으로 약간의 추측이 필요할 수도 있습니다. 정확도를 더욱 높이기 위해 아래의 행 계산 제안과 결합할 수 있습니다.
편집하다read(10,
이것을 테스트하는 동안 ( zsh
) 및 select(1, [0], NULL, NULL, NULL
( cli 인터프리터)를 만났습니다 python3
. 아마도 다른 가능성은 거의 없을 것입니다. 이것이 바로 RegEx
아래 스크립트에서 이에 국한하지 않은 이유입니다. 지금은 왼쪽 괄호만 찾고 있습니다.
어쩌면 누군가가 이 작업을 수행하는 더 정확한 방법을 알고 있을까요?
프로세스 상태
좋은 지표는 프로세스가 실행 중인지 아니면 절전 모드인지 확인하는 것입니다. 를 사용하여 이 작업을 수행할 수 있습니다 ps
. 이 방법은 아래 개념 증명 스크립트의 스택 추적과 함께 사용됩니다.
계산 라인
서버를 Child Process
Node에서 프로세스 로 실행하면 stdin
Node stdout
의 프로세스와 상호 작용할 수 있습니다. 줄 바꿈( )만 찾아볼 수 있으며 \n
, 출력되어야 하는 줄 수를 알고 있다면 이를 세어 실행이 완료되고 다시 입력을 기다리고 있다는 것을 "알" 수 있습니다. 이를 시간 초과와 결합할 수 있습니다.
프로세스 상태/Strace를 사용한 개념 증명
스크립트와 일부 문서를 다음으로 옮겼습니다.github 저장소. 나는 이것을 아직 mc로 테스트하지 않았지만 python3
and와 함께 작동합니다 zsh
(테스트할 수 있는 한 "테스트" 섹션을 참조하십시오). 여전히 약간의 대기 시간이 필요하고 오탐지가 발생할 수도 있고 발생하지 않을 수도 있으므로 아직 완벽하지는 않습니다.
사용하는 방법
tmux
다음과 같이 서버/세션을 시작할 수 있습니다.
tmux new-session -d -s server_name "java -jar minecraft_server.jar"
서버에 명령을 보내는 것은 다음과 같습니다.
./trun.sh -s server_name -c "the command"
서버의 출력을 반환해야 합니다. 매개변수 -H
를 조정해야 할 수도 있습니다 -T
.
동시성
네트워크 서버에서 이 프로그램을 실행하면 특히 사용자가 여러 명인 경우 문제가 발생할 수 있습니다. 구현해야 할 수도 있습니다.잠그다여러 사용자가 동시에 셸에 액세스하는 것을 방지합니다. 그 자체로는 문제가 되지 않을 것이라고 확신 tmux
하지만, 해당 출력을 읽으려고 하는 동안 다른 명령이 실행될 수 있다면 실제로 출력을 예측할 수 없습니다.
안전
www에 노출된 서버에서 이 프로그램을 실행할 계획이라면 이를 보호하는 것을 고려하십시오(예: apache
비밀번호로 보호된 프록시를 통하거나 사용 nginx
).