Динамическое название терминала: показать состояние загрузки сервера с интервалом X секунд

405
virtualeyes

Когда у меня в WM открыто несколько терминалов, было бы неплохо, если бы заголовки окон терминалов отражали текущего пользователя и хоста (легко), а также динамическую информацию о загрузке сервера, обновляемую через некоторый промежуток времени (сложнее).

Используя PROMPT_COMMAND, я могу получить нужные данные в заголовке окна терминала; однако, это требует, чтобы я что-то делал (например, менял каталоги), чтобы заголовок окна обновлялся самой последней информацией. В идеале, как и многие, я бы предпочел ничего не делать.

Итак, есть ли какая-то магия заданного интервала времени ожидания, которую я могу применить, чтобы динамически обновлять заголовок окна без вмешательства пользователя?

function curr_load { # interval wrapper here, or somewhere at any rate ;-) uptime } PROMPT_COMMAND='echo -ne "\033]0;$@$ [`curr_load`]\007"' 

Спасибо за подсказки

0

2 ответа на вопрос

2
Dave C

The only way I'd know of would be a background process. You could either start this automatically with .bash_profile or similar (but you would probably want to check you were in an xterm and also this will cause load as every window will display it), or start it once manually when you login.

So for example using your code above, create a file in the PATH called printload set to exec containing:

#!/bin/bash function curr_load { # interval wrapper here, or somewhere at any rate ;-) uptime } while true; do echo -ne "\033]0;$@$ [`curr_load`]\007" sleep 3 done 

And then just start printload with:

printload & 

Which you can of course put itself into a script to be called automatically or manually.

** NOTE: Not tested for syntax but should work in theory **

+1 интересно, а как насчет простого grep'а верхней команды для строки загрузки в пакетном режиме + время задержки в функции curr_load? Это казалось бы более простым и менее ресурсоемким подходом virtualeyes 11 лет назад 0
Я бы подумал, что время безотказной работы будет менее интенсивным, чем у top -b -n 1 | grep "top -", а также есть какая-то другая информация, я думаю? Но любой способ генерирования отображения метода (фоновый цикл) - это самый простой способ периодического обновления. Dave C 11 лет назад 0
Да, время безотказной работы отображает ограниченный набор информации, и идея цикла в принципе хороша. Просто читал в пакетном режиме сверху и думал, что объединение флага обрезки -i (только для отображения сводки) и флага -d интервала для вывода каждые, скажем, 30 секунд, не будет проблемой с точки зрения ресурсов. Я опробую ваш подход, что бы ни делали работу, ничего из этого не приведет к полной остановке сервера ;-) virtualeyes 11 лет назад 0
Конечно, все зависит от того, какую информацию вы хотите. Выполнение с флагом обрезки сверху по-прежнему возвращает несколько строк данных, первая из которых, по-видимому, содержит ту же информацию, что и время безотказной работы, но все равно должна быть очищена. Конечно, если вы хотите получить многократную информацию из разных строк, объедините их, тогда будет отлично. В любом случае, как вы говорите, ничто не должно остановить мир. Удачи. Dave C 11 лет назад 0
Пожалуйста, отредактируйте свой ответ, и я проверю его - так как ваш уровень выполнения кажется бесконечным циклом, я думаю, вы имели в виду «printload» вместо «runload» в этой строке: «runload 2> & 1> / dev / null & "в файле загрузки. Кроме того, перенаправление стандарта out и err в / dev / null не позволяет отображать заголовок терминала. Похоже, что с оболочкой escape-последовательности "\ 033] 0;" и "\ 007" нет вывода от echo, или, по крайней мере, от вывода, который может быть передан по каналу. Например, «./runload> foo.txt» не создает ничего, кроме пустого файла, в то время как «./runload &» генерирует динамический заголовок терминала по желанию. virtualeyes 11 лет назад 0
Готово - полная загрузка удалена, как будто printload и работает, тогда почти так же просто сделать это, чем runload, которая делает это за вас. STDERR и т.д. редирект также удален. Dave C 11 лет назад 0
0
virtualeyes

Here's what I wound up doing, using @Dave C's background task approach with 2 executable bash scripts on the remote server, term-status and term-status-run.

#!/bin/bash function curr_load { cat /proc/loadavg | awk '' } function mem_free { cat /proc/meminfo | grep MemFree|awk '' } while true; do echo -ne "\033]0;$@$ `mem_free` [`curr_load`]\007" sleep 5 done ****** #!/bin/bash ~/scripts/./term-status & 

With the files in place on remote server I modify existing bash aliases to ssh into target remote machines, appending command to run on login like so:
alias goapache='ssh -i $ user@some-ip -t ~/scripts/./term-status-run; bash --login'

In my Linux window manager (i3) stacked terminals connected to remote server now have titles like:

foo@serv1 226MB [0.43 0.50 0.35] bar@serv2 332MB [0.23 0.38 0.27] baz@serv3 295MB [0.15 0.22 0.26] 

reflecting free memory and load averages at 5 second intervals.

Does the trick, kind of nice to see server status in terminal title bar, not to mention being far easier to distinguish local terminals from remote.