我有一个bash脚本,我从流星运行服务器端。我已经通过运行' 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秒)。我不确定这是否相关。
有人可以帮我理解发生的事情吗?
答案 0 :(得分:1)
这里有一个提示:
I20161207-15:22:07.031(-5)? running grade
I20161207-15:22:07.045(-5)? just finished.
只需几毫秒即可运行。意思是,你的Meteor方法很可能在exec()完成之前退出。我从未在Meteor中运行过exec(),因此我不确定该方法退出后该shell脚本是否继续运行。
您需要的是在Meteor方法中运行未来,因此在您的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方法将等到你的脚本完成。
(警告:我没试过这个,只是在我的非工作机器上从内存中输入这个解决方案)