在我的代码中,我需要检查程序是否启动。为此,我有一个函数“running”:

function running(app, callback) {
    var arg = 'pgrep --count ' + app;
    exec( arg, function(err, stdout, stderr) {
        if (err) {
            console.log('Error:' + inspect(err) + ' ' + stderr);
            callback('0');
        } else {
            var data = '' + stdout;
            callback(data.charAt(0)); //Will be 0 only if no app is started
        }
    });
}

有好几次效果不错,但现在我明白了:
Error: { [Error: Command failed: ]
[stack]: [Getter/Setter],
[arguments]:undefined,
[type]: undefined,
[message]: 'Command failed: ',
killed: false,
code: 1,
signal: null }

(stderr为空)
我不明白为什么,所以想不出任何解决办法。
有人能告诉我为什么我会犯这个错误吗?

最佳答案

pgrep如果没有与您的请求匹配的进程,将返回非零状态。节点将此非零状态解释为pgrep失败。通过使用echo $?可以很容易地在shell中检查这一点,它将显示上一个命令的退出状态。假设您有一些bash实例正在运行

$ pgrep --count bash; echo $?

您将在控制台上看到正在运行的bash实例数和退出代码,它们将是0。现在,如果你尝试一些不存在的东西:
$ pgrep --count nonexistent; echo $?

您将看到0的计数和1的退出状态。
以下是pgrep的手册页中有关退出状态的内容:
EXIT STATUS
    0      One or more processes matched the criteria.
    1      No processes matched.
    2      Syntax error in the command line.
    3      Fatal error: out of memory etc.

所以你可以用这样的方法检查结果:
var count;
if (err) {
    if (err.code === 1)
        count = 0; // Status 1 means no match, so we don't have to parse anything.
    else {
        // Real error, fail hard...
    }
}
else {
    count = ... ; // parse count from stdout
}
callback(count);

关于node.js - 使用pgrep时Node.js命令出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21283723/

10-13 09:06