PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : grep & Exitcode eines bestimmten Prozesses



obscurus
20.08.2004, 11:03
Hallo zusammen!

Dies ist mein erster Eintrag, also evtl. nicht wundern... ;)


Mein Problem:
grep (oder ähnliches) soll nach dem 1. gefundenen Treffer aufhören, sich quasi mit dem richtigen Exitcode (0 = etwas gefunden; keine Fehler) beenden.
Ich will dann den Exitcode von grep haben und nicht einfach nur den letzten ($?). Ich weiß nämlich nicht in welcher Reihenfolge was ausgeführt wird.

Allgemein:
Ich habe PER HAND ein Script zu starten, an einer bestimmten Stelle es zu beenden, einen Classenpfad zu setzen und zu guter letzt ein java-Prog zu starten.
Dies möchte ich mit einem weiteren Script automatisieren.

Mein Script sieht folgendermaßen aus:
#!/bin/bash
# Dieses Script startet automatisch den Proxy für die
# Grinderaufzeichnung

cd stress-1.2/

#in besagtem Verzeichnis muß des Script "runtest" wie angegeben ausgeführt
#werden. D.h. ". ./runtest.sh"
#Es produziert etliche Ausgben auf StdOut. Sobald der String "starting
#threads" ausgegeben wird, soll java abgeschossen werden.
#Das dachte ich mach ich mit "kill"
#Sobald grep den String "starting threads" gefunden hat, soll es abbrechen
#und mit dem Exitcode soll dann java abgeschossen werden.

. ./runtest.sh | grep 'starting threads'
if [ $? = 0 ]
then
kill `pgrep java`
fi

echo $CLASSPATH

java net.grinder.TCPProxy -httpplugin



Eigentlich recht billig, aber ich sitze bereits seit gestern früh an diesem KLEINEN SCRIPT und reiß mir bald die Haare aus! :(

:help:
es wäre schön, wenn mir jemand einen Tip geben könnte, wie ich das hinbekomme!

DANKE!!!

rup
20.08.2004, 12:42
Auf die schnelle faellt mir nur folgendes ein (es geht aber mit Sicherheit auch eleganter):



#!/bin/bash

./runtest.sh > /tmp/runtest.log & #Starte Prog und schreibe STDOUT in temp file
pid=$! #PID merken

# alle Sekunden das Logfile nach "starting threads" durchsuchen
# Wenn String gefunden wurde Schleife verlassen
while ! grep "starting threads" /tmp/runtest.log
do
sleep 1
done

kill $pid
rm /tmp/runtest.log

bluelupo
20.08.2004, 18:36
Hallo zusammen!

[...]
. ./runtest.sh | grep 'starting threads'
if [ $? = 0 ]
then
kill `pgrep java`
fi
echo $CLASSPATH
java net.grinder.TCPProxy -httpplugin
[...]


Hi,

so sollte es funktionieren.

COUNTER=0
COUNTER=`. ./runtest.sh | grep 'starting threads' | awk '{if (NR==1) {print $0}}' | wc -l`
if [ $COUNTER -gt 0 ]; then
kill `pgrep java`
else
echo "Nothing to do...."
fi


In die Variable COUNTER wird die Anzahl der Zeilen (wc) deines "grep", aber davon nur eine Zeile (awk), abgelegt. Das heißt du bekommst entweder das Ergenis 1 oder 0. Darauf kannst du dann in der if-Abfrage entsprechend reagieren.

obscurus
24.08.2004, 13:56
Danke euch beiden!!

Nun hab ich wieder "Gedankenfutter"! :)