X 초마다 명령 수행


10

10 초 동안 명령을 수행하고 백그라운드에서 실행하고 watch싶습니다 (따라서 ? 제거 ). 모든 답변은 다음과 같이 표시되지만 11 ~ 14 초 동안 실행됩니다. 이것이 어떻게 이루어질 수 있습니까?

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

실시간 신호일 수도 있습니다. 윤초의 적절한 처리. 행운을 빕니다.
mikeserv

@ mikeserv 그래서, 노력을 귀찮게하지 않습니까? 나는 밀리 초 정확도에 관심이 없으며 단지 0.5 초라고 말합니다.
user1032531

무엇을 이루려고 노력하고 있습니까? 그런 종류의 빈도로 실행 해야하는 작업은 일반적으로 다른 문제의 해결 방법이라는 것을 알았습니다.
Sobrique

@Sobrique 정확합니다. 폴링 데이터 로거의 개념 증명을하고 있습니다. 실제로는 다른 언어로 프로그래밍되지만 현재는 작동합니다.
user1032531

답변:


16

어때요?

( # 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 : 추가 보호를위한 모든 의견, 대안 및 하위 셸을 사용하면 시작보다 훨씬 복잡해 보입니다. 비교를 위해 여기에 wait또는에 대해 걱정하기 시작하고 격리해야 kill할 상황이 다음 $!과 같습니다.

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

나머지는 실제로 필요할 때만 사용할 수 있습니다.


코드 덤프의 원인을 설명 할 수 있습니까?
Ismael Miguel

2
또한 코드가 작동하는 쉘을 인용하기 위해 (mikeserv의 답변과 같이) 다른 쉘이 다르게 동작 할 때 사람들이 혼동하지 않습니다. :)
ash

@IsmaelMiguel 나는 의견이 추론을 설명 할 것이라고 생각했습니다. 무엇이 확실하지 않은지 잘 모르겠습니다.
Sidhekin

1
bash 매뉴얼은 다음과 $!같이 말합니다 : "가장 최근에 백그라운드에 놓인 작업의 프로세스 ID로 확장됩니다."는 백그라운드에 sleep배치되지 않으므로 아닙니다. :)
Sidhekin

1
와. 두 가지 모두 잘못되었습니다. 언제 그런 일이 있었습니까?
mikeserv

9

당신은에서 다음과 같은 작업을 수행 할 수 있습니다 bash, zsh또는 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

2
재설정을 피하려면을 SECONDS수행하십시오 sleep "$((10-(($SECONDS-$start_time)%10)))". 당신은 start_time=$SECONDS루프 전에해야합니다.
ctrl-alt-delor

@richard-왜 피하는가?
mikeserv

언젠가는 그런 루프에서 호출하는 스크립트로 작성하기 때문입니다. 그리고 하루 종일 그것이 왜 제대로 작동하지 않는지 궁금해 할 것입니다. 즉, 재설정하면 중첩되지 않습니다 SECONDS. 최신 편집에서와 같이 서브 쉘을 생성하면이 문제를 피할 수 있습니다.
ctrl-alt-delor

1
@richard- while true루프 에 관한 질문이므로 쉘 상태가 살아남을 것으로 예상되지 않았습니다. 어쨌든 루프를 자체 컨텍스트에서 래핑하는 것이 가장 좋습니다. 그런 상황에서는 '술' trap보다는 $SECONDS'술 ' 에 대해 더 걱정할 것입니다 .
mikeserv 2016

고마워 마이크, 나는 비슷한 것을하려고 생각했지만 아직 구체적인 방법을 알지 못했습니다. 그러나 Sidhekin의 솔루션은 같은 일을하는 것처럼 보입니다. 나는 더 나은 답을 판단 할 자격이 없지만 무언가를 고를 의무가 있다고 느꼈다.
user1032531 2018 년

3

BASH 만 해당-명령에서 소비 한 시간을 계산하고 10에서 뺄 수도 있습니다.

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

배쉬 맨 :

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.