如何在 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.spawn
和 child_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);
});
有一台服务器,我可以访问,但没有所有权。它在默认端口 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.spawn
和 child_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);
});