Admite sleepargumentos 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 etimelugar de etimescomo 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/\?//ges deshacerse de los ?caracteres que procps' psusa como reemplazo para los caracteres de control. Sin él, no se analizaría sleep $'\r1d'o sleep $'\t1d'... Desafortunadamente, en algunas configuraciones Cregionales, 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 \t5dentre un .5d(medio día)).
Pase el pid como argumento.
Eso también supone que el argv[0]pasado a sleepno 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:]SSsalida en lugar de solo el número de segundos, reemplace el print $tcon:
$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'muchasshimplementaciones, es el mismo proceso que se ejecutashy luego se ejecutasleep 2(1 segundo después).exec). Pero ese es un buen punto para cualquier solución general.mkshyksh93al menos) tienensleepincorporados (por lo que no aparecerían enps), necesitaría saber de antemano con quésleepimplementaciones está tratando.