Gibt es eine Möglichkeit zu überprüfen, wie lange ein laufender "Schlaf" -Prozess noch dauert, bevor er im Terminal endet?
Gibt es eine Möglichkeit zu überprüfen, wie lange ein laufender "Schlaf" -Prozess noch dauert, bevor er im Terminal endet?
Antworten:
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.
Wenn Ihre Version von ps
unterstützt etimes
( etime
in 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 sleep
Prozess ausgeführt wird.
Hinweis: Es werden etime
keine etimes
Sekundenbruchteile sleep
ausgegeben, sie können jedoch als Argument verwendet werden. Dies wird wahrscheinlich die Genauigkeit Ihrer Berechnung beeinträchtigen.
Für MacOS und andere ohne etimes
kö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
}'