Я пытаюсь написать терминальное приложение, которое позволило бы мне запускать и останавливать сервер Minecraft, записывать аргументы через readline, которые сначала проверялись бы процессом Node, а затем, если это определено сценарием, отправлялись в Minecraftвместо этого используется сервер.
Работает в Windows 10 с последней сборкой Node и сервером Minecraft JE.
Сначала я проверил, как только запускается процесс узла, который порождался в дочернем процессе, содержащем сервер Minecraft.,Я установил 3 аргумента stdio как «наследовать», а также «ipc» (не уверен на 100%, почему это необходимо, но я видел, как это делают другие).После запуска, если я наберу что-нибудь в терминал, сервер Minecraft получит вход через Node.Это было здорово.Однако я хотел, чтобы у меня была возможность запускать readline и анализировать входные данные и определять, должен ли Node обрабатывать входные данные или их следует отправлять на сервер Minecraft.
Поэтому я поигрался с аргументами stdio ииспользуя process.stdin.write () и т. д., пытаясь выяснить, как записать в stdin дочернего процесса, чтобы сервер Minecraft получал входные данные, но безрезультатно.
Поэтому я попытался запустить«основной» процесс узла, который будет форкировать вторичный процесс узла.«Мастер» запускает readline и использует child.send (), если какой-либо вход должен быть отправлен туда.Затем, во втором процессе Node, я запускаю сервер Minecraft как spawn со всеми 3 аргументами stdio, установленными для наследования.Затем я прослушал бы process.on ('message') и, если сообщение было получено, записал его в process.stdin, надеясь, что процесс Minecraft получит его через унаследованный ввод.Но это тоже не сработало.
Я пробовал много разных вещей, но в итоге мне не повезло.Я пытался искать столько, сколько мог, но я не нашел ничего, что помогло бы мне.Извините, если это в конечном итоге становится легкой задачей.
// First Iteration
// spawns in a minecraft server and listens for input in the terminal
// effectively the same as running the equivalent run command for the minecraft server, except this runs as a Node child process
const spawn = require('child_process').spawn
var minecraft = spawn('java', ['-jar', '-Xms1G','-Xmx1G', '-Dfile.encoding=utf8', '../spigot-1.13.2.jar'], {
stdio: [
'inherit',
'inherit',
'inherit',
'ipc'
],
})
// Second Iteration
// changed cp stdin to pipe and tried to write manually via rl
const spawn = require('child_process').spawn
const readline = require('readline')
var minecraft = spawn('java', ['-jar', '-Xms1G','-Xmx1G', '-Dfile.encoding=utf8', '../spigot-1.13.2.jar'], {
stdio: [
'pipe',
'inherit',
'inherit',
'ipc'
],
})
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
}).on('line',(line)=> {
process.stdin.write(line)
})
// Later iterations involved running nested child processes, basically, but were all more or less more-abstract versions of my second iteration.
Чего я хотел бы достичь, как я уже говорил ранее, так это возможности прослушивать входные данные администратора от терминала с readline и, при необходимости,отправьте эти данные на серверный процесс Minecraft.В противном случае ввод readline будет обрабатываться в процессе Node.
**, чтобы уточнить, когда я говорю, что он не работает, я имею в виду, что я не получаю ответ от процесса сервера Minecraft.Ничего в игре, ничего в командной строке.На первой итерации я мог видеть результаты процесса Minecraft как в игре, так и в командной строке.Но по второй итерации ничего.