2011-09-27 110 views
1

我正在尝试编写一组函数,可以检查当我遇到一些意外输出时是否正在运行进程名称。我已经凝结的问题取决于系统ps命令,可以采取“-fC的论点下面的脚本名称isRunning.sh ...无法理解ps | wc输出差异

#!/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 
+0

请向我们展示您的程序的输出。 –

+0

我似乎无法得到这个帖子格式化我想要的方式。 – bittramp

+0

改为编辑您的问题。注释不适用于格式文本 –

回答

1

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

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

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

更妙的是,你应该看看pidofpgrep如果你能依靠他们存在于无论您的目标是哪个系统。或者使用LSB函数,如果你在Linux上。

编辑:其实,因为您正在寻找自己的副本运行,您可能会拿起壳来做叉子来实现管道。

+0

谢谢。我需要做的事情之一是检查是否有一个已经运行的脚本实例。所以我把ps给了wc来计数。我会看看我是否可以让pgrep工作。我只是不明白我的脚本中发生了什么。我可以执行ps -fC $ {progname} | wc -l在我的脚本之前的pRet分配,我得到了2的输出。我想我正在做的事情是获得额外的换行,只是不知道在哪里。也许是一个红帽的事情。 – bittramp

+0

我刚刚在不同的redhat 9机器上试过这个脚本,得到了3/2结果。我可以用其他选项解决这个问题,但我只是好奇。 – bittramp

+0

@bittramp:可能是一个RedHat的东西,我在Debian上(或者是因为我测试了一些稍微不同的东西 - 请参阅我的编辑)。但是无关紧要,因为RedHat肯定有'pidof'。或者你可以使用退出代码。 – derobert