无法理解ps | wc输出差异

时间:2011-09-27 16:30:57

标签: bash

我试图写一组函数,当我遇到一些意外的输出时,可以检查进程名是否正在运行。我在以下脚本名称isRunning.sh中压缩了这个问题,这取决于可以采用'-fC'参数的系统ps命令......

#!/bin/bash
progname=isRunning.sh
ps -fC isRunning.sh
pRet=`ps -fC ${progname} | wc -l`
echo pRet $pRet
psOut=`ps -fC ${progname}` 
wcOut=`echo "${psOut}" | wc -l`
echo
echo ps output
echo "${psOut}"
echo
echo wcOut $wcOut

第一次尝试将ps输出传递给wc获得3的返回。第二次尝试获得预期的返回值2.任何人都可以解释这种行为吗?我认为这是我要忽视的愚蠢行为。

谢谢, BBB

编辑:我的输出

UID        PID  PPID  C STIME TTY          TIME CMD
root      6717  5940  0 13:10 pts/0    00:00:00 /bin/bash ./isRunning.sh
pRet 3

ps output
UID        PID  PPID  C STIME TTY          TIME CMD
root      6717  5940  0 13:10 pts/0    00:00:00 /bin/bash ./isRunning.sh

wcOut 2

1 个答案:

答案 0 :(得分:1)

我两次尝试都得到了。你的ps可能会输出一个额外的空行,或者某些,然后你的shell的反引号扩展剥离它。或者也许你第一次运行它时实际上有两个进程匹配。

如果您只想查看它是否正在运行,请检查ps中的退出代码:

if ps -C "${progname}" > /dev/null; then
  echo its running
else
  echo not running
fi

更好的是,如果您可以依赖它们出现在您定位的系统上,则应该查看pidofpgrep。或者使用LSB函数,如果你在Linux上。

编辑:实际上,既然你正在寻找自己运行的副本,你可能会拿起一个用来实现管道的分支。