我有一个 bash 脚本,正在 meteor 的服务器端运行。我已经测试过,我能够通过运行“ls”成功运行 shell 命令并获得预期的响应。但是,当我运行 shell 脚本时,服务器控制台不会记录任何输出,并且脚本的预期效果都不会成功。我正在打印 stderr、stdout 和错误,但当我运行脚本时它们什么也不打印。
Meteor.methods({
grade: function(unittest, code) {
this.unblock();
var sys = Npm.require('sys');
var exec = Npm.require('child_process').exec;
// exec('/bin/ls /srv/srcalyzer/scripts', function(error,stdout,stderr){
// console.log('error: ',error);
// console.log('stdout: ',stdout);
// console.log('stderr: ',stderr);
// });
console.log('running grade')
exec('/bin/bash /srv/srcalyzer/scripts/grade.sh', function(error,stdout,stderr){
console.log('error: ',error);
console.log('stdout: ',stdout);
console.log('stderr: ',stderr);
});
console.log('just finished.');
},
尽管当前已注释掉/bin/ls/some/path ,但它会将预期输出记录到控制台。但是,当我运行/bin/bash/path/to/.sh 时,我知道它已经就位。控制台输出如下所示
I20161207-15:22:07.031(-5)? running grade
I20161207-15:22:07.045(-5)? just finished.
该脚本的运行时间很短(约 15-20 秒)。我不确定这是否相关。
有人可以帮我理解发生了什么吗?
最佳答案
这里有一个提示:
I20161207-15:22:07.031(-5)? running grade
I20161207-15:22:07.045(-5)? just finished.
运行只需要几毫秒。这意味着,您的 Meteor 方法可能会在 exec() 完成之前退出。我从未在 Meteor 中运行过 exec(),所以我不确定该 shell 脚本在您的方法退出后是否继续运行。
您需要在 Meteor 方法中运行 future,这样在 shell 脚本返回之前它不会退出。
类似于:
let future = new Future();
exec('/bin/bash /srv/srcalyzer/scripts/grade.sh', function(error,stdout,stderr){
console.log('error: ',error);
console.log('stdout: ',stdout);
console.log('stderr: ',stderr);
future.return(stdout.toString());
});
return future.wait();
现在您的 Meteor 方法将等待脚本完成。
(警告:我没有尝试过这个,只是在我的非工作机器上从内存中输入这个解决方案)
关于javascript - 从 Meteor 运行 bash 脚本服务器端时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41026718/