javascript - 从 Meteor 运行 bash 脚本服务器端时出现问题

标签 javascript node.js bash meteor server-side

我有一个 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/

相关文章:

javascript - 使用链式查询从列表中选择

node.js - 如何正确在线上传本地主机网站?

bash - 将变量设置为终端命令的结果 (Bash)

node.js - Solana 程序发送多个lamport 传输并发出事件

node.js - 如何解决Nodejs中的net::ERR_ABORTED 404

linux - bash 粘贴不保留换行符

linux - Bash while 循环使用包含本地 $variable 的远程 grep

javascript - 使用 jQuery .on() 获取元素

php - 无法使 xmlhttprequest 发送方法正常工作

JavaScript 函数定义