2017-01-06 3 views
1

Ich habe einen Cron-Job, der alle 8 Stunden ein Shell-Skript startet, die wiederum eine Reihe von Programmen aufruft. Manchmal werden diese Programme nicht ordnungsgemäß beendet und sie bleiben in der Schwebe stecken.Finden Sie PID von jedem Prozess im Shell-Skript aufgerufen

Also, wenn mein cron'd Skript (run_foo_bar.sh) sieht wie folgt aus:

python foo.py 
python bar.py 

... ich mehrere Foo und Bar des gleichzeitig laufen haben. Gerade jetzt bekomme ich die PIDs beteiligt, indem Sie eine ps -ax |grep foo machen und dann die Laufzeit finden mit ps -p $PID -o etime=, aber das wird umständlich.

Die Python-Programme enthalten eine Reihe von Debug-Anweisungen, die auf die Konsole gedruckt werden, und das Shell-Skript selbst wird an Protokolldateien weitergeleitet. Ich wollte einen Weg finden, der die PID jedes Prozesses Echo würde, sobald sie zusammen mit ihrem Aufruf Zeit aufgerufen wird, so meine run_foo_bar.sh würde wie folgt aussehen:

date 
python foo.py 
<some magic to find PID> 
echo foo.py is running as PID $PID 

date 
python bar.py 
<some magic to find PID> 
echo bar.py is running as PID $PID 
+0

können Sie nicht etwas zum Python-Code hinzufügen, so dass es seine PID selbst melden und auf std-out setzen kann? Viel Glück. – shellter

+0

Vielleicht [das] (https://stackoverflow.com/a/13202292/2877364)? – cxw

+1

Gegenwärtig wird 'python foo.py' ausgeführt, bis' foo.py' beendet wird, an diesem Punkt gibt es keine PID mehr zu bekommen. Würden Sie bitte klären? Verschiebt sich 'foo.py' in den Hintergrund oder so? Woher weißt du, wenn ein Prozess "in der Schwebe steckt"? – cxw

Antwort

1

Also für Vollständigkeit, auf der Python Seite, Sie kann:

import os, sys 
print(os.getpid()) 
sys.stdout.flush() 

die aktuelle PID ausgeben. Möglicherweise möchten Sie es in eine Datei anstelle des Terminals drucken, damit Sie es aus dieser Datei abholen können.

In der Schale, da Sie nur darauf warten, für den Cron-Job auszuführen sind, ist eine weitere Option diese (modifiziert nach this answer):

python foo.py & echo "$!" > "some file somewhere that will hold the PID" ; fg 

Das python foo.py im Hintergrund ausgeführt wird, speichert die pid des python Prozess (die in $! per this) ist, und dann python in den Vordergrund zurückkehrt, damit es normal ausgeführt werden kann.

Verwandte Themen