Watch: 마지막 출력 이후 출력이 변경된 경우에만 화면에 인쇄합니다.

Watch: 마지막 출력 이후 출력이 변경된 경우에만 화면에 인쇄합니다.

프로세스를 실행 중이고 스레드 수를 계산하고 있습니다.

ps huH p <PID_OF_U_PROCESS> | wc -l

watch이 스레드를 다음과 같이 실행할 수 있습니다 .

watch -n 1 ps huH p <PID_OF_U_PROCESS> | wc -l

그러면 프로세스가 실행 중인 스레드 수가 출력되지만 일반적으로 해당 숫자는 변경되지 않습니다.

명령을 마지막으로 실행했을 때부터 변경된 경우에만 새 번호를 화면에 인쇄하려면 어떻게 해야 합니까?

예를 들어:

64 65 64 (몇 분이 지나감) 65

등.

답변1

다음으로 파이프할 수 있습니다 uniq.

while ps -o nlwp= -p "$pid"; do sleep 1; done | uniq

답변2

watch이 작업을 직접 수행할 수 없습니다. 명령 출력의 차이점을 강조 표시하거나( 옵션을 통해 -d) 출력이 변경될 때 종료할 수 있지만( 옵션을 통해 -g) 둘 이상의 실행 출력을 표시할 수는 없습니다. 하지만 다른 일반적인 도구를 통해 이를 달성할 수 있습니다.

가능한 많은 솔루션 중 하나:

last=""; while true; do cur="$(ps h -o nlwp -p <PID>)"; if ! [ "$cur" = "$last" ]; then last="$cur"; echo "$(date) $cur"; fi; sleep 1; done

또는 더 읽기 쉽습니다.

last=""
while true
do
    cur="$(ps h -o nlwp -p <PID>)"
    if ! [ "$cur" = "$last" ]
    then
        last="$cur"
        echo "$(date) $cur"
    fi
    sleep 1
done

설명: 이 ps옵션은 -o nlwp스레드 수를 직접 인쇄하므로 을 호출할 필요가 없습니다 wc -l. 프로세스 ID를 자동으로 결정하기 위해 $(pidof programname)대신 사용할 수도 있습니다 . 나는 또한 나에게 유용해 보이는 <PID>현재 날짜를 추가했습니다 . $(date)마음에 들지 않으면 그냥 제거하세요.

관련 정보