Node.js require(';子进程';)。exec停止程序

Node.js require(';子进程';)。exec停止程序,node.js,Node.js,在Windows 10中, 我有一个express服务器,它在路由中启动命令 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') .th

在Windows 10中, 我有一个express服务器,它在路由中启动命令

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);
  });
}
当客户端向该路由发出请求时,丛服务器启动,但服务器从不显示“Ok”。但是,如果我手动关闭Plex服务器,那么程序流将到达res.send(“Ok”)

在Plex服务器关闭之前,我无法在不停止服务器响应的情况下启动此命令

取消浏览编辑

我遗漏了一些东西。 如果运行node并在node commad行中写入:

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,打印“ok”,节点控制台等待另一个命令

但是,如果我像这样创建一个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,打印“ok”,但在我不关闭Plex Server之前,它不会继续。

经过大量烦人的尝试和错误,我找到了解决此问题的方法

exec('start "Title" "C:\\Program Files (x86)\\Plex\\Plex Media Server\\Plex Media Server.exe', { timeout : 1000 })

一秒钟后,exec将控制权返回主程序。

经过大量烦人的尝试和错误,我找到了解决此问题的方法

exec('start "Title" "C:\\Program Files (x86)\\Plex\\Plex Media Server\\Plex Media Server.exe', { timeout : 1000 })
一秒钟后,exec将控制权返回主程序。

在后台运行命令 下面是实际发生的情况:
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')
在后台运行您的命令 下面是实际发生的情况:
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')

尽量不要重复引用路径。同时检查错误。该命令正常工作。问题是,在完成该过程之前,它不会打印“ok”。如果执行
.spawn()
,则可以检查stdout或stderr。可能是丛服务器没有将任何事件发送回起始位置,该事件预期进程将继续并从起始位置退出?请尝试不重复引用该路径。同时检查错误。该命令正常工作。问题是,在完成该过程之前,它不会打印“ok”。如果执行
.spawn()
,则可以检查stdout或stderr。可能是丛服务器没有将任何事件发送回“启动”状态,该状态预计进程将继续并从那里退出?是的,超时是一个令人讨厌的解决方案,但“启动”B对我不起作用。我在另一台计算机上尝试过,使用另一台Plex服务器,执行仍在继续(即使没有/B)。我认为我的服务器计算机有问题,因为我不明白问题出在哪里,我看到你把它放在
/B
,我注意到了
/B
,有什么区别吗?将输出重定向到文件或NUL如何?请参见Windows中的编辑,在/B和/B之间没有区别。空输出不起作用是的,超时是一个令人讨厌的解决方案,但“开始”B对我不起作用。我在另一台计算机上尝试过,使用另一台Plex服务器,执行仍在继续(即使没有/B)。我认为我的服务器计算机有问题,因为我不明白问题出在哪里,我看到你把它放在
/B
,我注意到了
/B
,有什么区别吗?将输出重定向到文件或NUL如何?请参见Windows中的编辑,在/B和/B之间没有区别。空输出无效。这是我唯一可行的解决方案。我认为引号、参数顺序有问题,我不知道……这是我唯一可行的解决方案。我想引号里有个问题,参数的顺序,我不知道。。。