출력이 동일하게 유지될 때까지 명령을 관찰할 수 있습니까?
를 사용하면 watch -g
명령 결과가 변경되었는지 확인하고 이를 트리거로 사용하여 스크립트의 다음 단계로 이동할 수 있습니다. 하지만 명령이 두 번의 연속(또는 정의된 연속 횟수) 실행에서 동일한 출력을 반환하는지 확인하려면 어떻게 해야 합니까?
그것은 마치
watch --exit-on-constant-output --number-of-minimum-identical-runs=10 <command>
현재 제가 생각할 수 있는 유일한 방법은 처음 실행될 때 출력을 저장한 다음 다음과 같이 비교하는 스크립트입니다.
#!/bin/bash
breaklimit=4
n=0
old=$(command)
while ((1)) ; do
current=$(command)
if [[ "$old" == "$current" ]] ; then
echo "command gave same output"
n=$((n+1))
echo "number of identical, consecutive runs: $n"
if [[ $n -eq $breaklimit ]] ; then
break
fi
else
echo "command gave different output"
old="$current"
n=0
sleep 2
fi
done
echo "run next command"
예를 들어 $(($RANDOM/10000))
as 명령을 사용하면 잘 작동합니다. 하지만 더 우아한 방법이 있을까요?
PS: 가상의 사용 사례가 도움이 될 수도 있습니다. 온도계를 가공 기계에 연결하고 온도가 안정되면 생산을 시작한다고 가정해 보겠습니다. 따라서 60초마다 온도계에 현재 온도를 쿼리하겠습니다.
답변1
이것은 (Linux에서) 작동하는 것 같습니다:
while :
do
timeout 8 watch -g my-command my-args || break
done
노트:
"실행 횟수"를 의미하는 대신 출력이 동일해야 하는 시간(초)만 지정합니다.
my-command
런타임 시 종료되는 것을 원하지 않는 경우 이는 적절하지 않을 수 있습니다. 또는 최소한-n
시간 초과 값과 시계의 옵션을 조정하여 이런 일이 발생할 가능성을 줄여야 합니다.
설명하다:
기본 아이디어는 시간 초과가 만료될 때 명령이 계속 실행 중인 경우 timeout 명령이 오류(종료 코드 124)와 함께 종료된다는 것입니다. (당신은 달릴 수 있습니다
timeout 2 date; echo $?
timeout 2 sleep 3; echo $?
실제로 확인해 보세요.
이를 와 비교합니다 watch -g
. 시계가 시간 초과되기 전에 종료되면(즉, 출력 변경) 시간 초과가 종료 코드 0으로 반환되고 루프가 계속됩니다.
내 예에서는 8초 이내에 출력이 변경되지 않으면 시계는 시간 초과로 종료되고 시간 초과는 오류와 함께 종료되어 루프를 중단합니다.