在Windows 10中, 我有一个快递服务器,可以在路由中启动命令
const exec = util.promisify(require('child_process').exec);
module.exports = router.use(function(req, res) {
exec('start "Title" "C:\\Program Files (x86)\\Plex\\Plex Media Server\\Plex Media Server.exe')
.then((r) => {
res.send("Ok.");
})
.catch((e) => {
res.status(401).send("Running error.", error);
});
}
当客户端请求此路由时,Plex服务器将启动,但服务器永远不会呈现“确定”。但是,如果我手动关闭Plex Server,则程序流程将达到res.send(“ Ok。”);
在Plex Server关闭之前,我无法在不停止服务器响应的情况下启动此命令。
拼命编辑
我缺少一些东西。 如果我运行节点并在节点逗号行中写:
console.log(require('child_process').exec('start "xx" "C:\\Program Files (x86)\\Plex\\Plex Media Server\\Plex Media Server.exe"')); console.log("ok");
它将打开Plex Serven,打印“确定”,然后节点控制台等待另一个命令
但是,如果我这样创建一个mynode.js
console.log(require('child_process').exec('start "pp" "C:\\Program Files (x86)\\Plex\\Plex Media Server\\Plex Media Server.exe"')); console.log('ok');
从Windows CMD:
c:\tmp> node mynode.js
它会打开Plex Server,打印“确定”,但是直到我不关闭Plex Server为止,它不会继续。
答案 0 :(得分:0)
经过许多烦人的反复试验,我找到了解决此问题的方法。
var schemes = await _schemeProvider.GetAllSchemesAsync();
var providers = schemes
.Where(x => x.DisplayName != null || // schemes.DisplayName is null
(x.Name.Equals(AccountOptions.WindowsAuthenticationSchemeName, // "idsrv.external" != "Windows"
StringComparison.OrdinalIgnoreCase))
)
.Select(x => new ExternalProvider
{
DisplayName = x.DisplayName,
AuthenticationScheme = x.Name
}).ToList();
一秒钟后,exec将控制权返回给主程序。
答案 1 :(得分:0)
这是实际发生的情况:exec
等待命令返回成功或失败。但是,当您的命令运行时,它将在子进程中启动TTY,这意味着您的exec
语句将永远不会返回任何内容(直到该进程失败或您手动退出它)。
您要做的是在后台启动Plex服务器,然后继续执行。 超时是一个令人讨厌的骇客,并且可能有潜在的危险:想象一下,由于任何原因,在plex服务器未启动一秒钟后,您将继续执行并返回错误肯定消息。
只需将命令替换为:
exec('start /b "C:\\Program Files (x86)\\Plex\\Plex Media Server\\Plex Media Server.exe')
如果这不起作用,您还可以尝试以下操作:
将输出重定向到文件:
exec('start /b "C:\\Program Files (x86)\\Plex\\Plex Media Server\\Plex Media Server.exe > output.txt')
将输出重定向到空设备:
exec('start /b "C:\\Program Files (x86)\\Plex\\Plex Media Server\\Plex Media Server.exe > NUL')