Überprüfen des Status eines laufenden "Schlaf" -Vorgangs vom Terminal aus

3

Gibt es eine Möglichkeit zu überprüfen, wie lange ein laufender "Schlaf" -Prozess noch dauert, bevor er im Terminal endet?

BarryBluejeans
quelle

Antworten:

4

Der Schlafbefehl selbst bietet keinen Dienst, der die Überwachung der verbleibenden Schlafzeit ermöglicht. Es wird auch nirgendwo angezeigt.

Da der Befehl sleep ausgeführt wird, ohne dass eine Reihe von Systemaufrufen für den Kernel ausgegeben werden, können Sie auch kein typisches Debugging-Tool wie dtruss verwenden. Wenn Sie versuchen, mit dem lldb-Debugger eine Verbindung zum Prozess herzustellen, wird der Befehl sleep ebenfalls unterbrochen und kann nicht fortgesetzt werden.

Daher ist es nicht möglich, die verbleibende Zeit sehr genau zu bestimmen. Wenn Sie mit einem ungenauen Ergebnis auskommen können, gehen Sie wie folgt vor:

Führen Sie zuerst diesen Befehl aus:

ps xa | grep sleep

Dies sollte Ihnen den Befehl sleep mit der Anzahl der Sekunden anzeigen, die es insgesamt schlafen soll. Zum Beispiel:

1234 s0123 S+    0:00.01 sleep 789

Hier ist 789 die Anzahl der Sekunden, die der Befehl insgesamt schlafen soll.

Führen Sie anschließend diesen Befehl aus:

ps xa -o etime,command -c | grep sleep

Es zeigt Ihnen die Gesamtzeit, die der Prozess ausgeführt wurde:

  03:15 sleep

Dies bedeutet, dass der Prozess 3 Minuten und 15 Sekunden = 195 Sekunden lang inaktiv ist. Die verbleibende Ruhezeit beträgt 789 - 195 = 594 Sekunden.

jksoegaard
quelle
2

Wenn Ihre Version von psunterstützt etimes( etimein Sekunden ) (unter MacOS leider nicht unterstützt), können Sie dies verwenden, um die verbleibende Zeit zu berechnen:

ps xa -o etimes,command | awk '/[s]leep/ {print "time remaining for", $2, "is", $3 - $1, "seconds"}'

Beispielausgabe:

time remaining for sleep is 94 seconds

Oder Sie können dies vereinfachen, um nur die Nummer anzuzeigen:

ps xa -o etimes,command | awk '/[s]leep/ {print $3 - $1}'

Diese Befehle geben mehr als eine Zeile aus, wenn mehr als ein sleepProzess ausgeführt wird.

Hinweis: Es werden etimekeine etimesSekundenbruchteile sleepausgegeben, sie können jedoch als Argument verwendet werden. Dies wird wahrscheinlich die Genauigkeit Ihrer Berechnung beeinträchtigen.

Für MacOS und andere ohne etimeskönnen Sie etime( ddd-hh:mm:ss) in Sekunden konvertieren und dabei die in der Quelle von ps(in print.c) ausgeführten Berechnungen umkehren :

ps xa -o etimes,command | awk '
    BEGIN {
        f = "1 60 3600 86400";
        split(f, factors)
    }
    /[s]leep/ {
        split($1, parts, "[-:]");
        count = length(parts);
        for (i = count; i > 0; i--) {
            e += parts[i] * factors[count + 1 - i]
        };
        print e;
        e = 0
     }'
Dennis Williamson
quelle