출력이 변경되지 않을 때까지 명령을 관찰하십시오. `watch -g`의 반대

출력이 변경되지 않을 때까지 명령을 관찰하십시오. `watch -g`의 반대

출력이 동일하게 유지될 때까지 명령을 관찰할 수 있습니까?

를 사용하면 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

노트:

  1. "실행 횟수"를 의미하는 대신 출력이 동일해야 하는 시간(초)만 지정합니다.

  2. my-command런타임 시 종료되는 것을 원하지 않는 경우 이는 적절하지 않을 수 있습니다. 또는 최소한 -n시간 초과 값과 시계의 옵션을 조정하여 이런 일이 발생할 가능성을 줄여야 합니다.

설명하다:

기본 아이디어는 시간 초과가 만료될 때 명령이 계속 실행 중인 경우 timeout 명령이 오류(종료 코드 124)와 함께 종료된다는 것입니다. (당신은 달릴 수 있습니다

timeout 2 date; echo $?
timeout 2 sleep 3; echo $?

실제로 확인해 보세요.

이를 와 비교합니다 watch -g. 시계가 시간 초과되기 전에 종료되면(즉, 출력 변경) 시간 초과가 종료 코드 0으로 반환되고 루프가 계속됩니다.

내 예에서는 8초 이내에 출력이 변경되지 않으면 시계는 시간 초과로 종료되고 시간 초과는 오류와 함께 종료되어 루프를 중단합니다.

관련 정보