关于PID Shell脚本

时间:2010-06-09 06:57:04

标签: linux shell unix

我在主脚本中调用另一个shell脚本testarg.sh。 testarg.sh的日志文件以下面的格式存储在$ CUSTLOGS中

testarg.DDMONYY.PID.log 例如:testarg.09Jun10.21165.log

在testarg进程完成后的主脚本中,我需要grep日志文件中的文本“ERROR”和“COMPLETED SUCCESSFULLY”。 如何获取进程的PID并与DDMONYY结合使用以进行grepping。另外我需要检查是否文件 在grepping之前存在

$ CUSTBIN / testarg.sh

$CUSTBIN/testarg.sh
rc=$?
if [ $rc -ne 0 ]; then
          return $CODE_WARN
fi

3 个答案:

答案 0 :(得分:2)

您可以将testarg.sh放在背景中,将其pid放入$!,然后放入wait

#! /bin/bash
...

$CUSTBIN/testarg.sh &

LOGFILE=testarg.$(date +%d%b%y).$!.log       # testarg.09Jun10.12345.log

wait $!

# ... $? is set as you expect ...

[ -f $LOGFILE ] && grep {pattern} $LOGFILE

...

答案 1 :(得分:2)

如果您可以修改testarg.sh并且它不会输出任何内容,只需更改它以输出其日志文件,如下所示:

echo testarg.$(date +%blah).$$.log

然后使用:

fspec=$($CUSTBIN/testarg.sh)

在你父母身上。


或者,您可以提供包装函数来完成工作:

#!/bin/bash
function fgpid() {
        "$@" &
        pid=$!
        ps -ef | grep ${pid} | sed 's/^/DEBUG:/' >&2 # debugging
        wait ${pid}
        echo ${pid}
}
fspec=testarg.$(date +%d%b%y).$(fgpid sleep 5).log
echo ${fspec}

这会产生:

pax> ./qq.sh
DEBUG:pax    2656    2992 con  15:27:00 /usr/bin/sleep
testarg.09Jun10.2656.log

正如所料。


或者如果您认为您的可执行文件可能输出某些内容。这个将PID存储到变量中:

#!/bin/bash
function fgpid() {
        "$@" &
        pid=$!
        ps -ef | grep ${pid} | sed 's/^/DEBUG:/' >&2 # debugging
        wait ${pid}
}
fgpid sleep 5
fspec=testarg.$(date +%d%b%y).${pid}.log
echo ${fspec}

答案 2 :(得分:1)

有两种简单的方法可以获得刚刚产生的某些过程的PID。

一种方法是修改正在生成的程序(子进程),使其将PID写入文件。然后,您可以通过以下方式阅读:

 $CUSTBIN/testarg.sh
 TSTARGSPID=$(cat /var/run/custbin.testarg.pid)

另一个更优雅的方法是:

 $CUSTBIN/testarg.sh &
 TSTARGSPID=$!
 wait
 # Do stuff with PID and output files