我试图写一组函数,当我遇到一些意外的输出时,可以检查进程名是否正在运行。我在以下脚本名称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
答案 0 :(得分:1)
我两次尝试都得到了。你的ps可能会输出一个额外的空行,或者某些,然后你的shell的反引号扩展剥离它。或者也许你第一次运行它时实际上有两个进程匹配。
如果您只想查看它是否正在运行,请检查ps中的退出代码:
if ps -C "${progname}" > /dev/null; then
echo its running
else
echo not running
fi
更好的是,如果您可以依赖它们出现在您定位的系统上,则应该查看pidof
和pgrep
。或者使用LSB函数,如果你在Linux上。
编辑:实际上,既然你正在寻找自己运行的副本,你可能会拿起一个用来实现管道的分支。