Nodejs exec(ps ax | grep "something")若something不存在就报错,killed:false, code:1, signal:null,求解释

Nodejs exec(ps ax | grep “something”)若something不存在就报错,killed:false, code:1, signal:null,求解释

2014-10-10 17:29:32的屏幕截图.png

5 回复

Node.js exec 使用 ps ax | grep "something" 检查进程时遇到的问题

问题描述

在使用 Node.js 的 child_process.exec 方法执行命令 ps ax | grep "something" 时,如果 something 进程不存在,会返回错误信息:

{
    killed: false,
    code: 1,
    signal: null
}

这表示命令执行失败,但具体原因是什么?

解释

当你执行 ps ax | grep "something" 命令时,grep 本身也会出现在输出结果中。即使 something 进程不存在,grep 命令仍然会返回一个非零退出码(例如 1),因为 grep 在找不到匹配项时会返回 1。

因此,当你捕获到退出码为 1 的错误时,这并不意味着 something 进程不存在,而是 grep 找不到匹配项。为了正确判断 something 是否存在,我们需要检查输出内容是否为空。

示例代码

const { exec } = require('child_process');

function checkProcessExists(processName) {
    return new Promise((resolve, reject) => {
        exec(`ps ax | grep "${processName}"`, (error, stdout, stderr) => {
            if (error) {
                // 检查错误是否是因为找不到匹配项
                if (error.code === 1 && !stderr.trim()) {
                    resolve(false); // something 不存在
                } else {
                    reject(error); // 其他错误
                }
            } else {
                // 检查是否有匹配项
                const outputLines = stdout.split('\n');
                const processExists = outputLines.some(line => line.includes(processName));
                resolve(processExists);
            }
        });
    });
}

// 使用示例
checkProcessExists("something")
    .then(exists => {
        console.log(`Process exists: ${exists}`);
    })
    .catch(error => {
        console.error("Error:", error);
    });

代码说明

  1. exec 方法:用于执行系统命令。
  2. 错误处理:当命令返回错误且 stderr 为空时,我们认为这是由于 grep 找不到匹配项导致的,此时 something 进程不存在。
  3. 检查输出:如果命令成功执行,则通过解析输出来确定是否存在包含 processName 的行。

这样,我们就能更准确地判断 something 进程是否存在,而不会被 grep 返回的非零退出码误导。


2014-10-10 17:32:50的屏幕截图.png 错误信息

grep不带参数本来就是错的啊

POSTGRESQL_CHECK 命令有错。。

当你使用 Node.js 的 child_process.exec 执行命令 ps ax | grep "something" 并且 something 不存在时,可能会遇到 killed: false, code: 1, signal: null 的情况。这表示命令执行失败了,但进程没有被强制终止。

code: 1 是命令执行后的退出状态码。在类 Unix 系统中,退出码为非零通常意味着命令执行失败。在这种情况下,grep 没有找到匹配项,因此它返回了一个非零退出码。

你可以通过捕获回调函数中的错误来处理这种情况。以下是一个简单的示例代码:

const { exec } = require('child_process');

exec('ps ax | grep "something"', (error, stdout, stderr) => {
  if (error) {
    console.error(`执行出错: ${stderr}`);
    // 如果你想处理特定的退出码,可以在这里检查
    if (error.code === 1) {
      console.log('没有找到匹配的进程');
    }
    return;
  }

  console.log(`标准输出: ${stdout}`);
});

上述代码中,我们使用 exec 执行命令,并通过回调函数处理结果。如果命令执行失败(即 error 存在),我们可以通过检查 error.code 来判断是否因为 grep 未找到匹配项而导致的错误,并相应地处理。

回到顶部