Запуск экранной сессии Linux с помощью Nodejs Spawn - PullRequest
0 голосов
/ 29 июня 2019

В настоящее время я работаю над системой панели веб-администратора для управления игровыми серверами для конкретной игры и мода.Я хочу внедрить в панель функцию, позволяющую вам запускать и останавливать серверы индивидуально, нажимая кнопки запуска и остановки.

Чтобы иметь возможность пометить процессы сервера и их дочерние элементы так, чтобы я мог найти их сновапозже, чтобы убить, я использую экраны Linux и маркирую их.Я использую команду spawn для nodejs, чтобы запустить экран.Как показано здесь:

  console.log(`screen -m -d -S serverscreen${server.id} wine ${(args.disableWSE === true) ? 'mb_warband_dedicated.exe' : 'WSELoaderServer.exe'} -r "Configs/${args.config}" -m "${args.module}"`);


  const program = spawn(
    'screen',
    [
      '-m', '-d',
      '-S', `serverscreen${server.id}`,
      'wine',
        (args.disableWSE === true) ? 'mb_warband_dedicated.exe' : 'WSELoaderServer.exe',
        '-r', `Configs/${args.config}`,
        '-m', `${args.module}`
    ],
    {
      cwd: currentGameserverPath,
      detached: true,
      stdio: 'ignore'
    }
  );

Тем не менее, я столкнулся с проблемой, которую я исчерпал все свои знания при попытке решить.Команда не работает при использовании в spawn, то есть я могу запустить команду, показанную в console.log, в каталог cwd, и игровой сервер успешно запустится, однако, когда вызывается команда spawn, экран не запускается.Я зарегистрировал stderr и stdout, и оба они пусты, и spawn завершает работу с 0.

Любые предложения?

Для большего контекста, здесь остальная часть функции, которая инкапсулирует этот фрагмент кода:

export default async (parent, args, context) => {
  /* Check for Permissions */
  if (context.user === null)
    throw new Error('You must be logged in to complete this action.');

  const requestingAdmin = await AdminPermission.findOne({
    server: args.serverID,
    admin: context.user
  });

  if (requestingAdmin === null)
    throw new Error('You do not have permission to do that.');

  const server = await Server.findOne({
    id: args.serverID
  });
  if(server === null) throw new Error('Server not found.');

  const currentGameserverPath = path.join(
    require.resolve('gameservers'),
    `../${server.id}`
  );
  if (!fs.existsSync(currentGameserverPath))
    throw new Error('Server folder does not exist!');


  const executablePath = path.join(
    currentGameserverPath,
    (args.disableWSE === true) ? '/mb_warband_dedicated.exe' : '/WSELoaderServer.exe'
  );
  if (!fs.existsSync(executablePath)) throw new Error('Executable does not exist!');

  const moduleFolder = path.join(currentGameserverPath, `/Modules/${args.module}`);
  if (!fs.existsSync(moduleFolder)) throw new Error('Module does not exist!');

  let configFile = path.join(currentGameserverPath, `/Configs/${args.config}`);
  if (!fs.existsSync(configFile)) throw new Error('Config does not exist!');

  console.log(`screen -m -d -S serverscreen${server.id} wine ${(args.disableWSE === true) ? 'mb_warband_dedicated.exe' : 'WSELoaderServer.exe'} -r "Configs/${args.config}" -m "${args.module}"`);


  const program = spawn(
    'screen',
    [
      '-m', '-d',
      '-S', `serverscreen${server.id}`,
      'wine',
        (args.disableWSE === true) ? 'mb_warband_dedicated.exe' : 'WSELoaderServer.exe',
        '-r', `Configs/${args.config}`,
        '-m', `${args.module}`
    ],
    {
      cwd: currentGameserverPath,
      detached: true,
      stdio: 'ignore'
    }
  );

  program.unref();


  server.gameserverLastModule = args.module;
  server.gameserverLastConfig = args.config;
  await server.save();

  return server;
}

1 Ответ

0 голосов
/ 30 июня 2019

При поиске я обнаружил новое преимущество. SO:

...