Admite sleep
argumentos GNU o Solaris 11 (una o más <double>[smhd]
duraciones, por lo que también funcionaría con implementaciones tradicionales que admitan solo un número entero decimal (como en FreeBSD), pero no con aquellos que aceptan argumentos más complejos como las duraciones ISO-8601 ). Usar en etime
lugar de etimes
como eso es más portátil (Unix estándar).
remaining_sleep_time() { # arg: pid
ps -o etime= -o args= -p "$1" | perl -MPOSIX -lane '
%map = qw(d 86400 h 3600 m 60 s 1);
$F[0] =~ /(\d+-)?(\d+:)?(\d+):(\d+)/;
$t = -($4+60*($3+60*($2+24*$1)));
for (@F[2..$#F]) {
s/\?//g;
($n, $p) = strtod($_);
$n *= $map{substr($_, -$p)} if $p;
$t += $n
}
print $t'
}
(el s/\?//g
es deshacerse de los ?
caracteres que procps
' ps
usa como reemplazo para los caracteres de control. Sin él, no se analizaría sleep $'\r1d'
o sleep $'\t1d'
... Desafortunadamente, en algunas configuraciones C
regionales, incluida la configuración regional, se usa en .
lugar de ?
. No hay mucho que podamos hacer en ese caso, ya que no hay forma de distinguir \t5d
entre un .5d
(medio día)).
Pase el pid como argumento.
Eso también supone que el argv[0]
pasado a sleep
no contiene espacios en blanco y que el número de argumentos es lo suficientemente pequeño como para que no se trunca ps
.
Ejemplos:
$ sleep infinity & remaining_sleep_time "$!"
Inf
$ sleep 0xffp-6d &
$ remaining_sleep_time "$!"
344249
$ sleep 1m 1m 1m 1m 1m & remaining_sleep_time "$!"
300
Para una [[[ddd-]HH:]MM:]SS
salida en lugar de solo el número de segundos, reemplace el print $t
con:
$output = "";
for ([60,"%02d\n"],[60,"%02d:"],[24,"%02d:"],[inf,"%d-"]) {
last unless $t;
$output = sprintf($_->[1], $t % $_->[0]) . $output;
$t = int($t / $_->[0])
}
printf "%s", $output;
sh -c 'sleep 1; sleep 2'
muchassh
implementaciones, es el mismo proceso que se ejecutash
y luego se ejecutasleep 2
(1 segundo después).exec
). Pero ese es un buen punto para cualquier solución general.mksh
yksh93
al menos) tienensleep
incorporados (por lo que no aparecerían enps
), necesitaría saber de antemano con quésleep
implementaciones está tratando.