Что касается PID Shell Script - PullRequest
0 голосов
/ 09 июня 2010

Я вызываю другой сценарий оболочки testarg.sh в моем основном сценарии.файлы журналов testarg.sh хранятся в $ CUSTLOGS в следующем формате

testarg.DDMONYY.PID.log Пример: testarg.09Jun10.21165.log

В основном скрипте после testargпроцесс завершен, мне нужно grep файл журнала для текста «ОШИБКА» и «ЗАВЕРШЕНО УСПЕШНО».Как мне получить PID процесса и объединить с DDMONYY для grepping.Также мне нужно проверить, существует ли файл перед grepping

$ CUSTBIN / testarg.sh

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

Ответы [ 3 ]

2 голосов
/ 09 июня 2010

Если вы можете изменить 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 голосов
/ 09 июня 2010

Вы можете создать фон 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 голос
/ 09 июня 2010

Есть два простых способа получить PID какого-то процесса, который вы только что создали.

Можно было бы изменить порождаемую программу (подпроцесс), чтобы она записывала свой PID в файл. Затем вы прочитали бы его с чем-то вроде:

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

Еще один более элегантный метод:

 $CUSTBIN/testarg.sh &
 TSTARGSPID=$!
 wait
 # Do stuff with PID and output files
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...