来自节点js的多个系统调用

时间:2015-06-01 10:53:33

标签: javascript node.js

我试图从节点js调用多个系统调用

我的代码段:

var sys = require('sys')
var exec = require('child_process').exec;                        
function puts(error, stdout, stderr) { sys.puts(stdout) }                                               
exec("rfkill block bluetooth ; rfkill unblock bluetooth ; hciconfig hci0 down ; hciconfig hci0 up", puts);
console.log('BLE intialization DONE');

但那些没有效果。如果我一个接一个地实现它们(即编辑文件然后一个接一个地放入命令然后执行)它正在工作。如果有人可以为此提出建议和解决方法,请告诉我。

编辑:或者是否有任何可以一个接一个地进行多个系统调用的示例

2 个答案:

答案 0 :(得分:1)

节点12有synchronous child process execution interface用于编写脚本:

  

同步过程创建

     

这些方法是同步的,这意味着它们将阻止事件循环,暂停执行代码直到生成的进程退出。

     

阻止这些调用对于简化通用脚本任务和简化启动时应用程序配置的加载/处理非常有用。

StrongLoop介绍了using it for scripting

var history = child_process.execSync('git log', { encoding: 'utf8' });
process.stdout.write(history);

在您的情况下,您应该检查每个命令中的错误(假设您关心它们)并做出适当的回应:

var shellCommands = ['rfkill block bluetooth', 'rfkill unblock bluetooth', 'hciconfig hci0 down', 'hciconfig hci0 up'];
shellCommands.forEach(function(command) {
    var execResponse = child_process.execSync(command, { encoding: 'utf8' });
    // if execResponse is non-zero, an error will be thrown here
    // if you want to continue, you should handle it with try/catch
    process.stdout.write(history);
});

答案 1 :(得分:0)

我不确定为什么你的代码无效。我有很多命令串在一个exec中,就像你在我正在处理的代码中的多个地方一样,它工作得很好。我认为您可能会看到的是,您的输出语句console.log('BLE initialization DONE')正在欺骗您认为您的执行完成时根本没有完成。 exec与您使用它的方式是异步的,所以在输出消息显示之前你不会等到它完成。

相反,试试这个:

var sCommand = "rfkill block bluetooth ; rfkill unblock bluetooth ; hciconfig hci0 down ; hciconfig hci0 up";

exec(sCommand, function (error, stdout, stderr) {
    console.log("error: ", error);
    console.log("stdout: ", stdout);
    console.log("stderr: ", stderr);

    console.log('BLE initialization DONE');
    puts(error, stdout, stderr);
    });