gpt4 book ai didi

node.js - 使用 Nodejs Spawn 启动 Linux 屏幕 session

转载 作者:太空宇宙 更新时间:2023-11-04 11:48:40 25 4
gpt4 key购买 nike

我目前正在开发一个网络管理面板系统,用于管理特定游戏和模组的游戏服务器。我希望在面板中实现一项功能,允许您通过单击启动和停止按钮单独启动和停止服务器。

为了能够标记服务器进程及其子进程,以便我以后可以再次找到它们并杀死它们,我正在使用 Linux 屏幕并标记它们。我正在使用 nodejs 的 spawn 命令来启动屏幕。如下所示:

  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,两者都是空的,生成以 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;
}

最佳答案

我在浏览 SO 时发现了一个新线索:

关于node.js - 使用 Nodejs Spawn 启动 Linux 屏幕 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56816140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com