Ich habe:
sleep 210m && for i in $(seq 1 5); do echo -e '\a'; sleep 0.5; done
Laufen als einfacher, schnörkelloser Timer, um mich daran zu erinnern, wann etwas getan werden sollte. Das sleep 210m
ist PID 25347.
Ich versuche herauszufinden, wie viel Zeit noch im Schlaf ist. Das Beste, was ich mir ausgedacht habe, wenn ich die ursprüngliche Schlafmenge (210 Minuten) eingegeben habe, ist:
$ echo "210 60 * $(ps -o etimes= 25347) - 60 ~ r n [:] P p" | dc
78:11
(Erläuterung: Das erste Bit berechnet die Anzahl der Sekunden im ursprünglichen Ruhezustand. Das $(ps…)
Bit erhält die Zeit seit Beginn des Ruhezustands in Sekunden, der Rest subtrahiert sie und wird in Minuten und Sekunden angezeigt.)
Mir fällt ein, dass dies im Allgemeinen nützlich wäre; Gibt es einen besseren Weg, dies zu tun? Oder zumindest eine clevere Methode, um die Schlafzeit zu analysieren ps -o args
?
sh -c 'sleep 1; sleep 2'
vielensh
Implementierungen wird beispielsweise derselbe Prozess ausgeführtsh
und später ausgeführtsleep 2
(1 Sekunde später).exec
). Aber das ist ein guter Punkt für jede allgemeine Lösung.mksh
undksh93
zumindest) integriert sindsleep
(also nicht angezeigt werdenps
). Sie müssen im Voraus wissen, mit welchensleep
Implementierungen Sie es zu tun haben.Antworten:
Unterstützung von GNU- oder Solaris 11-
sleep
Argumenten (eine oder mehrere<double>[smhd]
Dauern, daher auch bei herkömmlichen Implementierungen, die nur eine Dezimalzahl unterstützen (wie bei FreeBSD), jedoch nicht bei solchen, die komplexere Argumente wie die Dauer von ISO-8601 akzeptieren ). Verwendenetime
anstelle von,etimes
da dies portabler ist (Standard-Unix).(Das
s/\?//g
ist, um die?
Zeichen loszuwerdenprocps
,ps
die als Ersatz für Steuerzeichen verwendet werden. Ohne sie würde es nicht analysiertsleep $'\r1d'
odersleep $'\t1d'
... Leider wird in einigen Gebietsschemas, einschließlich desC
Gebietsschemas,.
anstelle von?
. Nicht viel können wir tun In diesem Fall gibt es keine Möglichkeit, einen\t5d
von einem.5d
(halben Tag) zu unterscheiden.Übergeben Sie die PID als Argument.
Dies setzt auch voraus, dass das
argv[0]
übergebene ansleep
keine Leerzeichen enthält und dass die Anzahl der Argumente klein genug ist, um nicht abgeschnitten zu werdenps
.Beispiele:
[[[ddd-]HH:]MM:]SS
Ersetzen Sie für eine Ausgabe anstelle von nur der Anzahl der Sekunden dieprint $t
durch:quelle
0xffp-6d
... Nun, das ist ein Testfall! Aber eigentlich braucht GNU Schlaf auch Dinge wiesleep 1h 30m
...sleep 1h -1m
was unter Solaris 11 funktioniert, aber nicht mit GNUsleep
. Zurück zum Zeichenbrett. Zumindest unterstützt es nicht die iso8601-Dauer wie ksh93, was viel schwieriger wäre.sleep
Pause eingelegt wird. In diesem Fall wird möglicherweise sogar ein negativer Wert angezeigt.remaining_sleep_time 12838
zurückgekehrt-40642
. Es könnte auf "Pause" sein, wie @rush angibt, aber nicht sicher, wie man debuggt?Dies schien ein lustiges Problem zu sein; Da Thrig eine Perl-Option behandelt hat, ist hier ein Bash-Skript, das etwas Ähnliches tut. Es wird nicht genügend Fehler überprüft (es wird davon ausgegangen, dass Sie eine gültige PID eines Schlafbefehls übergeben). Es behandelt dieselbe Syntax wie GNUs Coreutils Sleep , nämlich:
quelle
sleep 0.5d
odersleep 1e5
odersleep infinity
) nicht funktioniert . Ein Wechsel vonbash
zu einer Shell, die Gleitkommazahlen wie zsh, ksh93 oder yash unterstützt, würde helfen. Nicht dasetimes
ist nicht tragbar.perl
Dies kann besser mit einem Skript durchgeführt werden, das die verbleibende Zeit anzeigt, wenn ein
QUIT
(normalerweise control+\) oder einINFO
Signal verwendet wird.quelle
zsh
'ssched
und denat
Befehl für einen anderen Ansatz, mit dem die Zeit abgefragt werden kann.Sollte mit dem tqdm Python-Modul einfach genug sein.
Zeigt einen schönen visuellen Fortschrittsbalken und kann als Unix-Pipe verwendet werden.
https://pypi.python.org/pypi/tqdm
Das folgende Python-Snippet zählt 100 Sekunden
55% | ██████████ | 55/100 [00:55 <00:45, 1.00s / it]
quelle