从Meteor运行bash脚本服务器端的问题

时间:2016-12-07 20:25:09

标签: javascript node.js bash meteor server-side

我有一个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秒)。我不确定这是否相关。

有人可以帮我理解发生的事情吗?

1 个答案:

答案 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方法将等到你的脚本完成。

(警告:我没试过这个,只是在我的非工作机器上从内存中输入这个解决方案)