X초마다 명령 실행

X초마다 명령 실행

10초마다 명령을 실행하고 백그라운드에서 실행되도록 하고 싶습니다(따라서 watch?를 제거함). 모든 답변은 다음과 같이 표시되지만 실행하는 데 11~14초가 소요됩니다. 이것이 어떻게 달성될 수 있습니까?

while true; do
    # perform command that takes between 1 and 4 seconds
    sleep 10
done

답변1

어때요?

( # In a subshell, for isolation, protecting $!
  while true; do
    perform-command & # in the background
    sleep 10 ;
    ### If you want to wait for a perform-command
    ### that happens to run for more than ten seconds,
    ### uncomment the following line:
    # wait $! ;
    ### If you prefer to kill a perform-command
    ### that happens to run for more than ten seconds,
    ### uncomment the following line instead:
    # kill $! ;
    ### (If you prefer to ignore it, uncomment neither.)
  done
)

ETA: 추가 보호를 위한 이러한 모든 설명, 대안 및 하위 쉘을 포함하면 처음 시작했을 때보다 훨씬 더 복잡해 보입니다. 비교를 위해 waitor kill및 이들의 격리 요구 사항에 대해 걱정하기 $!전의 모습은 다음과 같습니다 .

while true; do perform-command & sleep 10 ; done

나머지는 필요할 때 바로 거기에 있습니다.

답변2

bashzsh, 또는 에서 다음과 같은 작업을 수행 할 수 있습니다 ksh.

SECONDS=0
while   command
do      sleep "$((10-(SECONDS%10)))"
done

bash매뉴얼에는 이렇게 나와 있습니다 $SECONDS.

$SECONDS

  • 이 매개변수가 참조될 때마다 쉘이 호출된 이후의 시간(초)이 반환됩니다. 값이 에 할당된 경우 $SECONDS후속 참조에서 반환되는 값은 할당 이후의 시간(초)에 할당된 값을 더한 값입니다. 만약 $SECONDS그렇다면 unset, 이후에 재설정되더라도 특별한 속성을 잃게 됩니다.

다음은 실제 예입니다.

(   SECONDS=0
    while   sleep   "$((RANDOM%10))"
    do      sleep   "$((10-(SECONDS%10)))"
            echo    "$SECONDS"
    done
)

10
20
30
40
50
60
70
80
90
100

답변3

BASH 전용 - 명령에 소요된 시간을 계산하여 10에서 뺄 수도 있습니다.

TIMEFORMAT=$'%0R'
while true; do
    T=$({ time command; } 2>&1)
    sleep $(( 10-T ))

BASH 사람들로부터:

TIMEFORMAT 이 매개변수의 값은 시간 예약어가 앞에 붙은 파이프의 타이밍 정보가 표시되는 방법을 지정하는 형식 문자열로 사용됩니다. % 문자는 시간 값이나 기타 정보로 확장되는 이스케이프 시퀀스를 소개합니다. 이스케이프 시퀀스와 그 의미는 다음과 같습니다. 중괄호는 선택적 부분을 나타냅니다.
%% 리터럴%.
%[p][l]R 경과 시간(초)입니다.
%[p][l]U 사용자 모드에서 소비된 CPU 시간(초)입니다.
%[p][l]S 시스템 모드에서 소비된 CPU 시간(초)입니다.
%P CPU 백분율로, (%U + %S) / %R로 계산됩니다.

선택사항인 p는 정밀도, 즉 소수점 이하 자릿수를 지정하는 숫자입니다. 값이 0이면 소수점이나 분수가 출력되지 않습니다.

관련 정보