Ausgabe: Nur erste Zeile

I

infinity331

Jungspund
Hallo Zusammen,

ich habe ein Skript geschrieben, welches mit mit Hilfe des RRDtools einige Daten grafisch ausgibt. Das Problem ist allerdings, dass ich eine sh-Datei ausführe und diese dann nach einigen anderen Befehlen wieder gestopt werden soll.

Das Ausführen sieht folgendermaßen aus:
Code:
sh /root/scripts/rrdtool/cronpluto.sh &

Jetzt benötige ich aber die PID um die Datei wieder zu stoppen, welche ich folgendermaßen raushole:
Code:
PID=$(ps -ax | grep cronpluto |awk '{print $1}')
kill PID

An dieser Stelle werden aber immer 2 PIDs ausgegeben, eine welche nicht "killbar" ist. Ich möchte daher nur die erste Zeile ausgegeben haben, damit ich die korrekte PID killen kann und die Datei somit beendet ist.

Ich hoffe ihr könnt mir weiterhelfen.

Gruß,
infinity331


PS: Using CentOS.
 
Hi,

wenn das Starten und Stoppen innerhalb des selben Skriptes passieren soll, kannst du doch besser einfach den job killen (kill %1)?

Z.B.:
Code:
#!/bin/bash
# while-true.sh

while true; do
    echo foo >> foo.bar
done
Code:
#!/bin/bash
# end-while.sh

echo "Start while loop in job 1."
./while-true.sh &
echo "Kill job 1."
kill %1
echo "Should be done now."

Oder passiert das Starten und Stoppen in unterschiedlichen sub-shells?

mfg,
bytepool
 
Hi,

du bekommst wohl 2 PIDs, weil bei
Code:
PID=$(ps -ax | grep cronpluto |awk '{print $1}')
der 'grep'-Befehl selbst immer mit erwischt wird, dieser beim 'kill' danach aber natürlich bereits beendet ist. Nimm doch stattdessen einfach
Code:
PID=$!
also die PID des zuletzt gestarteten Background-Prozesses. Die kannst du ja ggf. auch in einem Temp-File zwischenspeichern, wenn der 'kill' etwa aus einem anderen Skript erfolgen soll.

NB: davon, beim 'grep' z.B. mit 'head -1' die erste Zeile rauszuholen, würde ich abraten: m.E. gibt es keine Garantie dafür, dass die Prozesse wirklich immer in der dafür notwendigen Reihenfolge aufgelistet werden.

Gruss, A.
 
Wenn es denn unbedingt mit ps/grep sein soll.

Code:
PID=$(ps -ax | grep cronpluto | grep -v grep |awk '{print $1}')
 
... und wenn's auf keinen Fall '$!' sein soll, evtl auch
Code:
PID=$(ps -ax | grep [c]ronpluto | awk '{ print $1 }')
(damit fliegt der grep-Prozess schon mal selber raus), oder gleich ganz ohne grep (awk kann das ja auch alles)
Code:
PID=$(ps -ax | awk '/[c]ronpluto/ { print $1 }')
... das gibt dann nur noch Probleme, wenn gleichzeitig ein cronplutoXXX-Prozess aktiv ist, oder jemand mit dem Editor an einer cronpluto-Datei rumschraubt.

;)
A.
 
gibt es einen Grund, daß hier niemand
Code:
pidof
verwendet?
 
Danke, vielmals. Ich habe es mit der Lösung von floyd62 umgesetzt und funktioniert soweit auch ganz gut.

Hätte da nun doch noch eine Frage. Gibt es eine Möglichkeit die PID beim Ausführen eines Shell-Skripts durch ein anderes Skript direkt mitzulesen und zu speichern ohne erstmal in der ps - Ausgabe zu suchen?
 
Du könntest vom ersten Skript ein PID-File anlegen lassen, dass das andere Skript dann ausliest.
 
Jo, das habe ich mir so gedacht, nur war der Kern der Frage, wie dies geht. Aber habe da nun eine Lösung gefunden.
Ich speicher die PID mithilfe der Konstante $$ .
 

Ähnliche Themen

Erste Zeile aus Textdatei lässt sich nicht weiterarbeiten

SH & PHP funktion klapp aber keine ausgabe

Shellscript zum Starten / Stoppen von Programmen

Server-Monitoring mit RRDTool

Zurück
Oben