看不懂 ps |WC输出差异

  • 本文关键字:输出 WC 不懂 ps 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

编辑:my output

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

我两次尝试都得到2。您的ps可能会输出一个额外的空行,或者诸如此类的东西,然后shell的反勾展开将其剥离。或者你实际上有两个进程匹配你第一次运行它。

如果你只是想看看它是否在运行,检查退出代码从你的ps:

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

更好的是,您应该查看pidofpgrep,如果您可以依赖它们存在于您所针对的任何系统上。或者使用LSB函数,如果你在Linux上。

编辑:实际上,由于您正在寻找自己运行的副本,您可能会拿起shell进行fork来实现管道。

最新更新