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: 추가 보호를 위한 이러한 모든 설명, 대안 및 하위 쉘을 포함하면 처음 시작했을 때보다 훨씬 더 복잡해 보입니다. 비교를 위해 wait
or kill
및 이들의 격리 요구 사항에 대해 걱정하기 $!
전의 모습은 다음과 같습니다 .
while true; do perform-command & sleep 10 ; done
나머지는 필요할 때 바로 거기에 있습니다.
답변2
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
답변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이면 소수점이나 분수가 출력되지 않습니다.