Смотреть: Выводить на экран только в том случае, если вывод был изменен с момента последнего вывода

Смотреть: Выводить на экран только в том случае, если вывод был изменен с момента последнего вывода

Я запускаю процесс и подсчитываю количество потоков с помощью

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не может сделать это напрямую. Хотя вы можете выделить различия в выводе команды (через option -d) или выйти при изменении вывода (через option -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. Вы также можете использовать $(pidof programname)вместо , <PID>чтобы автоматически определить идентификатор процесса. Я также добавил текущую дату, $(date)что кажется мне полезным. Если вам это не нравится, просто удалите это.

Связанный контент