require('child_process')。exec停止程序

时间:2019-04-03 21:00:41

标签: node.js

在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为止,它不会继续。

2 个答案:

答案 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')