Formatieren Sie die Ausgabe von cputime für ps

12

Ich versuche, ein Skript zu schreiben, mit dem die CPU-Auslastung eines Prozesses über einen bestimmten Zeitraum überwacht werden kann (um ein Diagramm zu erstellen).

Bisher ist dies der Befehl, den ich verwende

ps -p $PROCID -o cputime,etimes

Meine einzige Sorge ist, dass die Ausgabe von Cputime zu sein scheint [dd]hh:mm(oder etwas Ähnliches, kann mich jetzt nicht mehr aus dem Kopf erinnern)

Gibt es eine Möglichkeit, die Cputime in Sekunden zu formatieren, ähnlich wie etime -> etimes, um die verstrichene Zeit in Sekunden zu ermitteln?

Bearbeiten: Dies ist die Ausgabe, die ich gerade erhalte

2-03:01:33 2653793

Ich möchte, dass der erste Parameter in Sekunden und nicht in Tagen, Stunden, Minuten und Sekunden formatiert wird.

dreadiscool
quelle
Können Sie bitte die Ausgabe, die Sie jetzt erhalten, und die Ausgabe, die Sie erhalten möchten, hinzufügen?
Simply_Me
@Simply_Me ich die Post bearbeitet haben
dreadiscool
@ John1024 Ja, das ist die Anzahl der Tage.
Dreadiscool

Antworten:

9

Dies konvertiert das erste Mal in Sekunden:

ps -p $PROCID -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'

Beispielsweise erzeugt der Befehl ps Folgendes:

$ ps -p 5403 -o cputime,etimes
    TIME ELAPSED
01:33:38 1128931

Der awkBefehl verarbeitet das und gibt Folgendes zurück:

ps -p 5403 -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'
5618 1128931

Erläuterung

  • -F'[: ]+'

    Dies weist awk an, sowohl Doppelpunkte als auch Leerzeichen als Feldtrennzeichen zu behandeln. Auf diese Weise werden die Stunden, Minuten und Sekunden als separate Felder angezeigt.

  • /:/ {t=$3+60*($2+60*$1); print t,$NF}

    Die Initiale /:/beschränkt den Code darauf, nur in Zeilen zu arbeiten, die einen Doppelpunkt enthalten. Dadurch werden die Kopfzeilen entfernt. Die Anzahl der Sekunden berechnet sich aus Stunden, Minuten, Sekunden über t=$3+60*($2+60*$1). Der resultierende Wert für twird dann zusammen mit der verstrichenen Zeit gedruckt.

Bearbeitungstage

Wenn psproduziert Tage, Stunden, Minuten, Sekunden, wie in:

2-03:01:33

Verwenden Sie dann stattdessen diesen Code:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ {t=$4+60*($3+60*($2+24*$1)); print t,$NF}'

Wenn der Ausgabe Tage vorangestellt werden oder nicht, verwenden Sie diesen Kombinationsbefehl:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ && NF==5 { t=$4+60*($3+60*($2+24*$1)); print t,$NF} /:/ && NF==4 {t=$3+60*($2+60*$1); print t,$NF}'
John1024
quelle
Verzeih mir, wenn ich mich irre, aber es sieht nicht so aus, als würde dieser Befehl Tage berücksichtigen, die auch vorangestellt werden können
dreadiscool
Das ist richtig: Mein System hat für keinen Prozess Tage angezeigt. Ich kann mir vorstellen, wie die Tage aussehen könnten, aber können Sie ein konkretes Beispiel geben?
John1024
2-03: 01: 33 ist 2 Tage, 3 Stunden, 1 Minute und 33 Sekunden. Tage werden jedoch nicht immer vorangestellt. Auf meinem System wird es nur vorangestellt, wenn der Prozess länger als 24 Stunden aktiv war. Vielen Dank für Ihre Hilfe, übrigens, ich schätze es
Dreadiscool
@ user1772510 Antwort aktualisiert, um Tage zu verarbeiten.
John1024
Vielen Dank für all Ihre Hilfe, wenn ich mich verbessern könnte, würde ich mich auch verbessern (nicht genug Repräsentanten in dieser Community), ich weiß das zutiefst zu schätzen!
Dreadiscool
2

Wenn du awk nicht ins Spiel bringen willst, eine reine Bash-Lösung (t_str enthält den formatierten String, t_sec die dekodierte Zeit in Sekunden):

# Decode the CPU time format [dd-]hh:mm:ss.
IFS="-:" read c1 c2 c3 c4 <<< "$t_str"
if [ -n "$c4" ]
then
  t_sec=$((10#$c4+60*(10#$c3+60*(10#$c2+24*10#$c1))))
else
  t_sec=$((10#$c3+60*(10#$c2+60*10#$c1)))
fi
Nicolas Breton
quelle
0

Sie geben nicht an, für welches Betriebssystem dies ist. Wenn es sich um Linux handelt und Sie an der Überwachung eines bestimmten Prozesses interessiert sind, lohnt es sich möglicherweise, ihn zu analysieren. Weitere Informationen finden Sie auf /proc/$PROCID/statder proc(5)Handbuchseite.

Toby Speight
quelle