【问题标题】:Pass : (Colon) into child_process SPAWN arg将:(冒号)传递到 child_process SPAWN arg
【发布时间】:2021-03-24 19:21:39
【问题描述】:

我有一个命令

omxplayer /home/pi/videos/9886a3n2545r7i505rzz.mp4 -o alsa:sysdefault

它从命令行运行良好,但如果我将该命令转换为生成命令:

let omxProcess = spawn('omxplayer', ['/home/pi/videos/9886a3n2545r7i505rzz.mp4', '-o', 'alsa:sysdefault'])

命令失败(没有任何错误)。

但是如果我运行以下删除 :sysdefault 它运行(但没有 :sysdefault,命令不一样,我需要使用 :sysdefault 运行它

  let omxProcess = spawn('omxplayer', ['/home/pi/videos/9886a3n2545r7i505rzz.mp4', '-o', 'alsa'])

我认为这与在 arg 中有一个“:”有关。

有什么想法吗?

【问题讨论】:

    标签: node.js linux raspberry-pi omxplayer


    【解决方案1】:

    由于您没有使用shell: true 标志,因此几乎可以肯定它不是由命令中的: 引起的。为了安全起见,您始终可以验证这一点。

    检查环境是否与您的参数混淆的一种简单方法是调用另一个二进制文件,例如echo,而不是omxplayer。它是否回应了你的论点?冒号还在吗?

    二进制文件可能正在退出并带有一些错误代码(可能还有错误消息)。要捕获它们,请务必在输出流上注册处理程序,以及应该告诉您退出代码的退出处理程序。这在child_process 文档中进行了概述,就在spawn() 下方。适合您的情况:

    omxProcess.stdout.on('data', (data) => {
      console.log(`stdout: ${data}`);
    });
    
    omxProcess.stderr.on('data', (data) => {
      console.error(`stderr: ${data}`);
    });
    
    omxProcess.on('close', (code) => {
      console.log(`child process exited with code ${code}`);
    });
    

    根据输出和退出代码,您应该能够调试问题。

    【讨论】:

    • 感谢您的建议。我跑了一个回声,命令是正确的。我在电子应用程序中运行它。你认为这可能与它有关吗?当命令没有正确执行时,我在控制台中看不到任何消息,但是在没有 :sysdefault 的情况下运行它,我确实在文件播放完毕后得到输出。
    • 我不确定 - 如果有疑问,请制作一个最小示例(纯 Node.js)并在您的目标系统上试用。 strace -p 等标准故障排除工具可能有助于识别系统调用上的锁定。
    猜你喜欢
    • 1970-01-01
    • 2016-09-01
    • 2012-07-27
    • 2021-11-27
    • 1970-01-01
    • 2021-10-20
    • 2018-11-27
    • 1970-01-01
    • 2019-06-05
    相关资源
    最近更新 更多