Bash:如何捕获真实的进程名称并阻止显示命令进程?

时间:2015-03-01 14:45:31

标签: bash shell

我写了下一个剧本:

process="$1"
if [ -z "$1" ]; then
        echo "Please specify a process to check"
        exit 1
fi
ps -ef | grep "$process" | grep -v {grep\|$(basename $0)} > /tmp/procs

if [ "$?" -eq "0" ]; then
        stat="OK"
        exitcode="0"
        msg="Process $process is running"
else
        stat="Critical"
        exitcode="2"
        msg="There are currently no running processes of $process"
fi
echo "$stat: $msg"
exit $exitcode

该脚本应检查给定进程是否正在运行并输出相关消息。

在脚本中,我使用以下命令查找进程是否正在运行: ps -ef | grep $process

问题是当脚本运行时,进程名称还包含$ process字,因此,它会找到实际进程和脚本进程(因为命令中提到了$ process)。 / p>

示例:

[root@pnmnjs2 ~]# sh -x check_proc_nodeJS.sh dakjdhak
+ process=dakjdhak
+ '[' -z dakjdhak ']'
+ ps -ef
++ basename check_proc_nodeJS.sh
+ grep -v '{grep|check_proc_nodeJS.sh}'
+ grep dakjdhak
+ '[' 0 -eq 0 ']'
+ stat=OK
+ exitcode=0
+ msg='Process dakjdhak is running'
+ echo 'OK: Process dakjdhak is running'
OK: Process dakjdhak is running
+ exit 0
[root@pnmnjs2 ~]#

含义:没有名为“dakjdhak”的实际进程,但是当脚本运行ps -ef命令时,它还会捕获正在运行的脚本的进程,然后返回该进程存在并运行...这是错。

如果没有正在运行的脚本进程,我怎样才能“捕获”相关进程? (command | grep -v {grep\|$(basename $0)}的添加应该已经完成​​了......但它没有...

提前致谢

3 个答案:

答案 0 :(得分:2)

您可以使用ps

而不是将grep的输出汇总到pgrep
# change this
# ps -ef | grep "$process" | grep -v {grep\|$(basename $0)} > /tmp/procs

# if [ "$?" -eq "0" ]; then
# to this
if pgrep "$process" > /tmp/procs; then

如果您想知道命令的返回值,则无需将$?[一起使用 - 只需直接测试命令。

答案 1 :(得分:1)

使用你的过程swtiches的一个小指针

ps -ef

-e开关将显示所有正在运行的进程,包括当您立即使用管道命令时

grep "$process" | grep -v {grep\|$(basename $0)}

因此,您永远不会收到错误

例如

ps -ef|grep "xxx" # if xxx is not running

输出(你的脚本)

OK: Process xxxxxx is running

您刚刚执行了运行的进程grep(如果grep对进程命令使用-ef参数成功,则无关紧要)。进程命令参见grep ran,结果没有捕获到错误。

您可以使用的是

ps -A or  ps -C

答案 2 :(得分:0)

您可以使用ps -C "$process"使用其可执行文件名称comm, not args)查找进程。