1

Я делаю эту команду для измерения использования оперативной памяти:

while sleep 1; do free && echo -e && ps -eo rss | awk '{sum+=$1} END {print sum}' && echo -e "\n"; done

Тем не менее, он по-прежнему печатает новые выходные данные вместо удаления / перезаписи последнего.

Цель состоит в том, чтобы сделать эту команду похожей на поведение top или htop.

Итак, вопрос: без написания сценария оболочки, как я могу сделать команду для обновления себя?


Я наткнулся на это: https://askubuntu.com/a/684887

Таким образом, printf "\033c" работает, но проблема в том, что он ведет себя как сброс, который очищает весь терминал, кроме последнего вывода.

Кроме того, watch тоже работают, но выход из них не сохранит последний вывод, как это делает top.

 

Есть ли способ смешать оба? Как имитировать поведение топа?

Top обновляется, не сбрасывая весь терминал, и сохраняет последний вывод при выходе из него.

3 ответа3

2

Используйте команду watch . Чтобы запустить указанную вами команду, что-то вроде:

watch -n 1 'free -t && echo && ps -eo rss | awk '\''{sum+=$1} END {print sum}'\'' && echo'

Обратите особое внимание на специальные кавычки вокруг команды awk необходимые для помещения одинарных кавычек в одинарные.

watch запускает программу с заданным интервалом (1 секунда здесь, с флагом -n 1 ) и отображает первый экран вывода на экране, обновляя каждый раз.

Если вы настроили сохранение выходных данных после выхода, вы можете еще раз выполнить команду в конце. Что-то вроде:

tmp='free -t && echo && ps -eo rss | awk '\''{sum+=$1} END {print sum}'\'' && echo'
watch -n 1 "$tmp" ; eval "$tmp"

Где я просто использую временную переменную $tmp чтобы не вводить всю команду дважды.

1

Что ж, если вы не возражаете очистить все остальное в окне терминала, вы можете добавить clear после сна:

while sleep 1; do clear; free -t && echo -e && ps -eo rss | awk '{sum+=$1} END {print sum}' && echo -e "\n"; done
0

Одно из решений состоит в том, чтобы избежать печати в подкомандах (таких как awk) и вместо этого получать все в переменных, а затем печатать все в одной строке с CR вместо LF в конце (для этого я использую bash printf):

 printf "%10s %4d %4d\r" $dev $recvdiff $senddiff

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .