2010-06-09 2 views
0

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

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

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

оглавлению

$ CUSTBIN/testarg.sh

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

ответ

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 

... 
+0

Я не хочу отправлять testarg.sh в качестве фоновой работы. в этом случае, что я могу сделать? – Arav

+0

Это не будет «фоном» в смысле фоновых команд интерактивной оболочки. Встроенный 'wait' будет вести себя синхронно, что он хочет, - подумайте об этом как о дополнительной дополнительной работе для получения PID дочерней команды. – pilcrow

+0

Большое спасибо за информацию ... Так что нет гонок, если я использую wait $! – Arav

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 
+0

у вас есть гонка, если '' testarg.sh' выходит во время назначения TSTARGSPID. В этом случае 'wait' будет немедленно возвращаться, а' $? 'Будет равен нулю.Это уже не раньше, разветвленные и забытые дочерние процессы, что было бы хуже ... Я думаю, вы хотите 'wait $ TSTARGSPID'. – pilcrow

+0

@pilcrow: Это не гонка. Перечитайте документы для своей оболочки. Под bash $! хранит самый последний процесс, который был запущен в фоновом режиме. Даже если вы ставите ожидание перед назначением, код будет работать (по крайней мере, под bash, но, вероятно, и у других). $! НЕ ищет таблицу процессов. Это будет гонка, и это одна из причин, по которой я даже не предлагал ее в качестве неясной третьей альтернативы. –

+0

проблема с '$?', А не с '$!'. Вы правы, однако, это не гонка. Это просто, что '$?' Будет отражать выход без аргументов 'wait', а не код выхода фонового процесса. (Мое недоразумение, извините!) – pilcrow

2

Если вы можете изменить testarg.sh и не иначе ничего выводить, просто изменить его выход его лог-файл с одной строкой:

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

затем использовать:

fspec=$($CUSTBIN/testarg.sh) 

в вашем родителе.


В качестве альтернативы, вы можете предоставить функцию-оболочку, чтобы сделать работу:

#!/bin/bash 
function fgpid() { 
     "[email protected]" & 
     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 

, как и ожидалось.


Или это, если вы считаете, что ваш исполняемый файл может выдавать что-то. Этот хранит ПИД-код в переменной:

#!/bin/bash 
function fgpid() { 
     "[email protected]" & 
     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} 
+0

Осторожно, что 'grep $ {pid}' будет соответствовать любому процессу, argv которого соответствует '$ {pid}', в первую очередь самому 'grep'. Кроме того, это будет соответствовать любому, чей PPID (или TTY, я полагаю) является текстовым подмножеством '$ {pid}' – pilcrow

+0

, но мне все равно нравится ваш подход. +1 – pilcrow

+0

grep предназначен для отладки и не влияет на решение, кроме как на тест, чтобы убедиться, что он работает. Тем не менее, вы поднимаете хороший момент, и, если я полагаюсь на это для чего-либо важного, это когда я буду ругать себя своими кошачьими хвостами :-) – paxdiablo

Смежные вопросы