使用Node.js的childProcess运行Shell脚本

35

我想在我的Node.js服务器上运行一个shell脚本,但是什么也没有发生...

childProcess.exec('~/./play.sh /media/external/' + req.params.movie, function() {}); //not working

另一个 childProcess 运行得很好,但上面的进程不会运行。

childProcess.exec('ls /media/external/', movieCallback); //works

如果我在终端中运行脚本,它就能工作。有什么想法吗?(chmod +x已设置)


1
是否有任何'error'或者输出任何'data'stdoutstderr - Jonathan Lonowski
/bin/sh: 1: /root/./play.sh: 找不到文件或目录,我该如何修改命令以运行存储在主目录中的脚本? - Ralf
2个回答

60

exec函数的回调函数具有错误、标准输出和标准错误参数。尝试将它们打印到控制台以帮助您诊断问题:

exec('~/./play.sh /media/external/' + req.params.movie,
  function (error, stdout, stderr) {
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    if (error !== null) {
      console.log('exec error: ' + error);
    }
});

/bin/sh: 1: /root/./play.sh: 找不到文件或目录,我该如何修改命令以运行存储在主目录中的脚本? - Ralf
谢谢,我找到了,只是路径不正确。(我想我得去睡觉了(23:39 UTC+1)) - Ralf
exec('~/./play.sh /media/external/' + req.params.movie ... 这个构造是安全的吗? - Yaur

5
exec('sh ~/play.sh /media/external/' + req.params.movie ,function(err,stdout,stderr){
      console.log(err,stdout,stderr);
 })

使用/media/external/+req.params.movie作为参数来运行你的play.sh shell脚本。输出可以通过回调中的stdout、stderr变量获得。

或者试试这个

var myscript = exec('sh ~/play.sh /media/external/' + req.params.movie);
myscript.stdout.on('data',function(data){
    console.log(data); // process output will be displayed here
});
myscript.stderr.on('data',function(data){
    console.log(data); // process error output will be displayed here
});`

请在您的答案中添加解释。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接