Настройка conky: Индикация состояния системы в Linux

Весьма удобно следить за состоянием своей системы, не слишком отрываясь от других задач. Здорово бросить взгляд на информативную панельку — и сразу получить всю информацию о работы системы, которая нужна. Именно для этих целей есть системные мониторы, например conky. Настроить conky в Linux очень просто, о чём и будет этот пост.

Умолчания, стиль и необходимость настройки conky
По умолчанию, установленный conky выглядит жутковато. Это такой тонкий намёк на то, что программу нужно подгонять под себя и свои представления об удобстве. Дело это до некоторой степени кропотливое, но сделав это раз, потом много раз экономим время.

Настраивается conky через свой конфиг, который нужно скопировать из /usr/share/doc/conky/examples/ в свой домашний каталог и переименовать в .conkyrc
Теперь открываем конфиг в своём любимом текстовом редакторе и начинаем его смотреть. Делится конфиг на две части: первая часть отвечает за то, как будет выглядеть системный монитор, а вторая — что он, собственно, будет отображать. Деление не строгое, и открыв конфиг, можно понять, почему.

Настраиваем conky под себя
В первой части конфиг довольно хорошо прокомментирован (во всяком случае, в Дебиане). Несколько наиболее важных параметров приведу ниже. Но прежде, чем вы начнёте запускать и пробовать, нужно кое-что учесть.

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

Во-вторых, процесс это исключительно интерактивный: меняете настройку — прибиваете текущий процесс conky — запускаете новый — смотрите — меняете настройку… и так далее. Лучше руководствоваться Первой Заповедью Радиотехники — «Не крути две ручки сразу«. Иначе потом трудно ловить ошибки в конфиге и думать, что привело к нежелательным последствиям.

Итак, первая часть параметров отвечает за то, как будет выглядеть системный монитор. Здесь можно выбрать, в частности, шрифт и его параметры:

# Xft font when Xft is enabled
xftfont Bitstream Vera Sans Mono:size=9

Время обновления, если в этом нет насущной необходимости, лучше ставить 1-2 секунды, хотя можно и меньше (тогда возрастает потребление ресурсов):

# Update interval in seconds
update_interval 2.0

Расположение по углам экрана, что тоже хорошо прокомментировано и потому понятно:

# Text alignment, other possible values are commented
#alignment top_left
#alignment top_right
#alignment bottom_left
alignment bottom_right

Ещё подробностей можно прочитать в официальном FAQ conky или, пользуясь своими знаниями английского, догадаться :-)

Это всё довольно просто — главное развлечение начинается при настройке переменных, которые и будут отображаться. Лучше всего за основу взять какой-нибудь образцовый конфиг отсюда и брать понравившиеся элементы. В этой замечательной статье (на русском!) есть много интересных идей — только читать её нужно с конца (пропуская философские отвлечения).
Короче говоря: вторая часть конфига выглядит примерно так

${переменная параметры}
$элемент оформления
${color цветтекста}
${переменная параметры}

Назначение переменных в основном понятно из их названий:

 

  • exec выводит на экран текст, возвращаемый вызываемой программой;
  • execbar и execgraph визуализируют вывод исполняемой команды в виде диаграммы или графика (выводимое значение должно лежать в пределах 0..100);
  • execi и texeci запускают команду циклически с интервалом (texeci — с интервалом, заведомо большим времени исполнения). execibar и execigraph полностью аналогичны execbar и execgraph, но для циклического выполнения команд;
  • if_running, if_existing и if_mounted — выводят всё вплоть до endif, если выполняется процесс, существует файл и монтирована точка монтирования, соответственно;
  • else — выводить, если ложны все вышестоящие выражения.

 

 

Надо сказать, что применение execi особенно для скриптов — дело довольно затратное, и скрипты лучше отрабатывать таким образом не часто (раз в несколько секунд).

Ниже — несколько наиболее интересных решений для отображения данных в conky.

Показывать текущее время в формате часы:минуты:секунды
${time %k:%M:%S}

Отображение занимаемой приложениями памяти
$mem/$memmax
Вот тут у меня был лёгкий конфуз: часто значения отображаемой памяти были неприлично маленькими — это происходит оттого, что не учитывается память, занятая кэшем.

Вывести три самых охочих до процессора приложения:
${color #ddaa00} ${top name 1} ${top pid 1} ${top cpu 1} ${top mem 1}
${color lightgrey} ${top name 2} ${top pid 2} ${top cpu 2} ${top mem 2}
${color lightgrey} ${top name 3} ${top pid 3} ${top cpu 3} ${top mem 3}

Несколько более сложным является отображение ACPI-данных о процессоре или питании системы. В этом нам помогут замечательные программы cat и cut. Вот как, например, вывести информацию о температуре на процессоре и включения троттлинга:

${color lightgrey} Core: $color ${
execi 2 cat /proc/acpi/thermal_zone/THRM/temperature | cut -c26-} — critical 115 C — ${color lightgrey} Throttling state: $color ${execi 2 cat /proc/acpi/processor/CPU1/throttling | grep active | cut -c26-}

Для удобства я подсветил цветом: красным — команды conky, серым — текст, который будет выведен, синим — системные команды, которые дают необходимые значения, зелёным — пути до данных ACPI (у вас они будут, скорее всего, другими).

Более навороченные трюки, типа отображения степени зарядки батареи ноутбука, описываются опять-таки здесь ближе к концу статьи. Напоследок — скриншот моего conky и текст его конфига.

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

# Conky advanced configuration
background yes

# Use Xft?
use_xft yes

# Xft font when Xft is enabled
xftfont Bitstream Vera Sans Mono:size=9

# Text alpha when using Xft
xftalpha 0.8

# Update interval in seconds
update_interval 2.0

# This is the number of times Conky will update before quitting.
# Set to zero to run forever.
total_run_times 0

# Create own window instead of using desktop (required in nautilus)
own_window no

# If own_window is yes, you may use type normal, desktop or override
own_window_type normal

# Use pseudo transparency with own_window?
own_window_transparent yes

# If own_window is yes, these window manager hints may be used
#own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager

# Use double buffering (reduces flicker, may not work for everyone)
double_buffer yes

# Minimum size of text area
minimum_size 300 5

# Draw shades?
draw_shades yes

# Draw outlines?
draw_outline no

# Draw borders around text
draw_borders no

# Draw borders around graphs
draw_graph_borders no

# Stippled borders?
stippled_borders 8

# border margins
border_margin 40

# border width
border_width 1

# Default colors and also border colors
default_color white
default_shade_color black
default_outline_color black

# Text alignment, other possible values are commented
#alignment top_left
#alignment top_right
#alignment bottom_left
alignment bottom_right
#alignment none

# Gap between borders of screen and text
# same thing as passing -x at command line
gap_x 12
gap_y 12

# Subtract file system buffers from used memory?
no_buffers yes

# set to yes if you want all text to be in uppercase
uppercase no

# number of cpu samples to average
# set to 1 to disable averaging
cpu_avg_samples 2

# number of net samples to average
# set to 1 to disable averaging
net_avg_samples 2

# Force UTF8? note that UTF8 support required XFT
override_utf8_locale no

# Add spaces to keep things from moving about?  This only affects certain objects.
use_spacer no

# Maximum size of buffer for user text, i.e. below TEXT line.
#max_user_text 16384

# Allow for the creation of at least this number of port monitors (if 0 or not set, default is 16) 
#min_port_monitors 16

# Allow each port monitor to track at least this many connections (if 0 or not set, default is 256)
#min_port_monitor_connections 256

# variable is given either in format $variable or in ${variable}. Latter
# allows characters right after the variable and must be used in network
# stuff because of an argument

# stuff after 'TEXT' will be formatted on screen

TEXT
$nodename - $sysname$kernel on $machine
$stippled_hr
${color lightgrey}Current time: $color${time %k:%M:%S} - ${color lightgrey}Uptime:$color$uptime${color lightgrey}- Load:$color$loadavg
${color lightgrey}CPU Usage:${color #cc2222}$cpu% ${cpubar}
${color blue}${cpugraph 0000ff 00ff00}
${color lightgrey}RAM Usage:$color$mem/$memmax  -  Swap Usage:$color$swap/$swapmax - $swapperc% 
${color lightgrey}File systems: $color${fs_free /}/${fs_size /}${fs_bar /}
${color lightgrey}Processes:$color$processes${color grey}Running:$color$running_processes
$stippled_hr
${color}Name              PID     CPU%   MEM%
${color #ddaa00}${top name 1}${top pid 1}${top cpu 1}${top mem 1}
${color lightgrey}${top name 2}${top pid 2}${top cpu 2}${top mem 2}
${color lightgrey}${top name 3}${top pid 3}${top cpu 3}${top mem 3}
${color}Mem usage
${color #ddaa00}${top_mem name 1}${top_mem pid 1}${top_mem cpu 1}${top_mem mem 1}
${color lightgrey}${top_mem name 2}${top_mem pid 2}${top_mem cpu 2}${top_mem mem 2}
${color lightgrey}${top_mem name 3}${top_mem pid 3}${top_mem cpu 3}${top_mem mem 3}
$stippled_hr
${color blue}System health ${color lightgrey}
${color lightgrey} Core: $color${execi 2 cat /proc/acpi/thermal_zone/THRM/temperature | cut -c26-} - critical 115 C - ${color lightgrey} Throttling state: $color${execi 2 cat /proc/acpi/processor/CPU1/throttling | grep active | cut -c26-}
${color lightgrey} Core clock: $color${execi 2 cat /proc/cpuinfo | grep 'cpu MHz' | cut -c12-}
$stippled_hr
${color red}Energy subsystem:
${color lightgrey}Power: $color${execi 2 cat /proc/acpi/ac_adapter/AC0/state | cut -c26-} - ${color lightgrey}Charging state:$color${execi 2 cat /proc/acpi/battery/BAT0/state | grep charging | cut -c26-}
${color lightgrey}Present rate :$color${execi 2 cat /proc/acpi/battery/BAT0/state | grep 'present rate' | cut -c26-} - ${color lightgrey}Battery energy:${color green}${execi 2 /usr/bin/myscript/kmvbatterystate}%
$color$stippled_hr
${color #ddaa00}Port(s)${alignr}#Connections   
$color Inbound: ${tcp_portmon 1 32767 count}  Outbound: ${tcp_portmon 32768 61000 count}${alignr}ALL: ${tcp_portmon 1 65535 count}
${color #ddaa00}Inbound Connection ${alignr} Local Service/Port$color
${tcp_portmon 1 32767 rhost 0}${alignr}${tcp_portmon 1 32767 lservice 0}
${tcp_portmon 1 32767 rhost 1}${alignr}${tcp_portmon 1 32767 lservice 1}
${tcp_portmon 1 32767 rhost 2}${alignr}${tcp_portmon 1 32767 lservice 2}
${color #ddaa00}Outbound Connection ${alignr} Remote Service/Port$color
${tcp_portmon 32768 61000 rhost 0}${alignr}${tcp_portmon 32768 61000 rservice 0}
${tcp_portmon 32768 61000 rhost 1}${alignr}${tcp_portmon 32768 61000 rservice 1}
${tcp_portmon 32768 61000 rhost 2}${alignr}${tcp_portmon 32768 61000 rservice 2}

Скрипт для отображения заряда батареи /usr/bin/myscript/kmvbatterystate

 

#!/bin/sh
MAX=`cat /proc/acpi/battery/BAT0/info |grep'design capacity:'|cut -b26-30`
CUR=`cat /proc/acpi/battery/BAT0/state |grep remaining |cut -d':' -f2 |cut -d' ' -f7`
PRC=$(($CUR * 100 / $MAX))
echo$PRC

Ещё раз напомню, что у вас пути в /proc к информации об ACPI могут быть другими.

Ссылки
Есть очень хорошая статья про conky, и даже на русском, но там вначале довольно много философии. Полный список переменных есть тут.

Поделиться заметкой:
Узнать версию Linux
Все способы узнать версию дистрибутива Linux (а также FreeBSD, MacOS и прочих)
Права на файлы
Права на файлы и папки в Linux, FreeBSD и MacOS
Настоящий интеллект