私は持っています:
sleep 210m && for i in $(seq 1 5); do echo -e '\a'; sleep 0.5; done
私が何をすべきかを教えてくれるシンプルで実用的なタイマーで動作します。sleep 210m
PID 25347です。
私は睡眠がどれくらい残ったかを調べようとしました。最初の睡眠時間(210分)を追加すると、私が思いついた最高の睡眠時間は次のようになります。
$ echo "210 60 * $(ps -o etimes= 25347) - 60 ~ r n [:] P p" | dc
78:11
(説明:最初のビットは元の睡眠の秒を計算します。そのビットは睡眠が$(ps…)
始まってからの時間を秒単位で取得し、残りのビットはそれを減算して分と秒単位で表示します。)
私はこれが一般的に役に立つと思います。より良い方法はありますか?それとも、少なくとも睡眠時間を分析する賢明な方法はありますかps -o args
?
ベストアンサー1
GNUまたはSolaris 11sleep
パラメータ(1つ以上の<double>[smhd]
期間)がサポートされているため、10進整数のみをサポートする従来の実装(FreeBSDなど)でも機能しますが、より複雑なパラメータを許可する実装では機能しません。ISO-8601期間)。移植性が高いので、etime
代わりに使用してください(標準Unix)。etimes
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'
}
(これはs/\?//g
制御文字の代わりに使用される ' 文字を削除するためのものです?
。これがなければ構文解析されないか... 残念ながらロケールを含む一部のロケールでは代わりに使用されます。 この場合にはできることはありません。 a(半日)を区別する方法はありません。procps
ps
sleep $'\r1d'
sleep $'\t1d'
C
.
?
\t5d
.5d
pidをパラメータとして渡します。
これはまた、argv[0]
渡された値にsleep
スペースが含まれておらず、引数の数が切り捨てられないほど小さいと仮定しますps
。
例:
$ sleep infinity & remaining_sleep_time "$!"
Inf
$ sleep 0xffp-6d &
$ remaining_sleep_time "$!"
344249
$ sleep 1m 1m 1m 1m 1m & remaining_sleep_time "$!"
300
[[[ddd-]HH:]MM:]SS
ほんの数秒の代わりに出力するには、次のようprint $t
に置き換えます。
$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;