【问题标题】:How to run child_process.exec correctly on an ajax request?如何在 ajax 请求上正确运行 child_process.exec?
【发布时间】:2021-10-22 18:45:05
【问题描述】:

有一个服务器,我可以访问,但没有所有权。它在默认端口 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 命令提供服务。服务器上有一个运行nodemon 的服务/进程,如果它也失败了,可以重新启动这个项目。因此,我无权访问该特定进程的输出。

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

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

我做错了什么?

【问题讨论】:

  • 好吧,你说了这么多:你无权访问服务器。您将无法通过 api 调用运行任何类型的 shell 命令。或者,如果您找到了一种方法,这将意味着服务器很容易受到远程 shell 攻击。
  • @NVRM 但是我可以使用 SSH 作为 root 连接到服务器,并且可以在终端中运行节点命令。还不够吗?
  • 好吧,那么是的,你会找到办法的。我误解了。也许只需在命令末尾添加& 即可分离执行。试试node script.js ${ip} &,看看它能做什么。见stackoverflow.com/questions/13338870/…
  • 非常感谢@NVRM,它成功了!我之前在文档中搜索过子进程,但不知道分离。另外,想对您的评论进行投票,但由于某种原因,我还没有看到对评论进行投票的选项。您是否可以回答这个问题,以便我接受它作为答案?如果不可能,我会回答自己,但会引用您的评论。
  • 做到了。有关积分的信息,请参阅stackoverflow.com/help/privileges

标签: javascript node.js ajax express child-process


【解决方案1】:

调用的进程可能处于阻塞状态,因此父脚本只是在等待子进程终止,或返回一些东西。

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

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

还要注意杀死/停止父脚本也会杀死子脚本。使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2017-06-09
    相关资源
    最近更新 更多