如何在 ajax 请求中正确地 运行 child_process.exec?

How to run child_process.exec correctly on an ajax request?

有一台服务器,我可以访问,但没有所有权。它在默认端口 3000 上为节点 js / express 应用程序提供服务。有几个脚本,通常是 运行 从终端手动或通过 cron 作业。我想要做的是在客户端有一个按钮并向某个路由发出 ajax 请求并执行带有内联参数的节点 js 命令。例如:

node script.js 123

所有路线均已设置并正常运行。我有一个处理请求的 CliController 文件,并且必须 运行 上面的命令。目前我正在使用以下代码:

cp.exec(`node script.js ${ip}`, function (err, stdout, stderr) {
      if (err) {
         console.log(err);
      }
      console.log(stdout);
      console.log(stderr);
 });

script.js 文件位于项目的根文件夹中,但项目本身是使用 express-generator 构建的,并使用 node bin/www 命令提供服务。服务器上有一个 service/process 运行s nodemon 如果它也失败了,可以重新启动这个项目。因此我无法访问该特定进程的输出。

如果我 运行 在终端中执行上面的命令(准确地说是从项目的根文件夹),它工作正常并且我看到了脚本的输出。但是如果我按下网页上的按钮发出请求,我很确定脚本不会执行,因为它必须更新数据库而且我没有看到任何变化。我也尝试过使用 child_process.spawnchild_process.fork 但没能成功。

我也试过 kill nodemon 并再次快速启动项目以查看控制台输出。如果我这样做,一切正常。

我做错了什么?

调用的进程可能处于阻塞状态,因此父脚本只是在等待子进程终止,或者 return 某事。

我们可以在 shell 命令中避免这种行为,方法是在末尾添加 &(& 符号控制运算符)。

这会在后台生成一个命令 运行。 (注意,您仍然可以使用 PID's and POSIX signals 控制子进程,这是另一个主题 ,但非常相关,您很快就会发现它非常方便)。

另请注意,killing/stopping 父脚本也会杀死子脚本。使用 nohup.

可以避免这种情况

这没有链接到 JavaScript 或 node.js,而是链接到 bash,并且可以与 shell.

中的任何内容一起使用
cp.exec(`node script.js ${ip} &`, function (err, stdout, stderr) {
      if (err) {
         console.log(err);
      }
      console.log(stdout);
      console.log(stderr);
 });

Bash reference manual