"수면" 시간이 얼마나 남았는지 확인하는 방법은 무엇입니까?

"수면" 시간이 얼마나 남았는지 확인하는 방법은 무엇입니까?

나는 가지고있다:

sleep 210m && for i in $(seq 1 5); do echo -e '\a'; sleep 0.5; done 

내가 무엇을 해야 하는지 알려 주는 간단하고 실용적인 타이머로 실행됩니다. sleep 210mPID 25347 입니다 .

나는 잠이 얼마나 남았는지 알아보려고 노력했다. 초기 수면 시간(210분)을 추가하면 내가 생각해낸 최고 수면 시간은 다음과 같습니다.

$ echo "210 60 * $(ps -o etimes= 25347) - 60 ~ r n [:] P p" | dc
78:11

(설명: 첫 번째 비트는 원래 수면의 초를 계산합니다. 해당 $(ps…)비트는 수면이 시작된 이후의 시간을 초 단위로 가져온 다음 나머지 비트는 이를 빼고 분과 초 단위로 표시합니다.)

나는 이것이 일반적으로 유용하다고 생각합니다. 더 좋은 방법이 있습니까? 아니면 적어도 수면 시간을 분석하는 현명한 방법이 있습니까 ps -o args?

답변1

GNU 또는 Solaris 11 sleep매개변수(하나 이상의 <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와 a(반나절)를 구별할 방법이 없습니다.procpspssleep $'\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;

답변2

이것은 흥미로운 질문인 것 같습니다. thrig는 perl 옵션을 다루기 때문에 비슷한 작업을 수행하는 bash 스크립트가 있습니다. 오류 검사가 충분하지 않습니다(sleep 명령에 유효한 PID를 전달한다고 가정합니다). 동일한 구문을 처리합니다.GNU coreutils 절전 모드실제로 그것은 다음과 같습니다:

  • s|m|h|d는 초/분/시간/일의 접미사를 나타냅니다.
  • 여러 시간 매개변수 추가

#!/usr/bin/env bash

# input: PID of a sleep command
# output: seconds left in the sleep command

function parse_it_like_its_sleep {
  # $1 = one sleep parameter
  # print out the seconds it translates to

  mult=1
  [[ $1 =~ ([0-9][0-9]*)(s|m|h|d) ]] && {
    n=${BASH_REMATCH[1]}
    suffix=${BASH_REMATCH[2]}
  } || {
    n=$1
  }
  case $suffix in
    # no change for 's'
    (m) mult=60;;
    (h) mult=$((60 * 60));;
    (d) mult=$((60 * 60 * 24));;
  esac
  printf %d $((n * mult))
}

# TODO - some sanity-checking for $1
set -- $(ps -o etimes=,args= $1)
[[ $2 = "sleep" ]] || exit 1
elapsed=$1
shift 2
total=0
for arg
do
  # TODO - sanity-check $arg
  s=$(parse_it_like_its_sleep $arg)
  total=$((total + s))
done
printf "%d seconds left\n" $((total - elapsed))

답변3

사용할 수 있는 간단한 솔루션을 찾고 있다면 다음과 같이 ps aux표시됩니다.시작시간. 하지만 정확한 값을 실행하기보다는 빠른 근사치를 위해서만 사용하고 싶을 수도 있습니다.

이 예에서 시작 시간은 15:47입니다. 그럼 잠은 15시 57분경에 끝나겠네요

여기에 이미지 설명을 입력하세요.

답변4

tqdm Python 모듈을 사용하면 쉬울 것입니다.

멋진 시각적 진행률 표시줄을 표시하며 유닉스 파이프로 사용할 수 있습니다.

https://pypi.python.org/pypi/tqdm

다음 Python 코드 조각은 100초를 계산합니다.

import time
from tqdm import tqdm
for i in tqdm(range(100)):
    time.sleep(1)

55%|██████████ | 55/100 [00:55<00:45, 1.00초/it]

관련 정보