我在主脚本中调用另一个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
答案 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