alibek Posted December 28, 2024 Posted December 28, 2024 На домашнем ПК настраиваю Conky. В принципе настроил, но утилита довольно часто вылетает. Делать скрипт, который будет его автоматически запускать, либо прикручивать monit не захотел, решил сделать все по правильному, через systemd. Сделал юнит: [Unit] Description=Conky System Monitor StartLimitIntervalSec=300 StartLimitBurst=5 After=graphical.target [Service] Type=forking ExecStart=/usr/bin/conky -d Restart=on-failure RestartSec=5s [Install] WantedBy=graphical.target Засунул его в ~/.config/systemd/user (и симлинк на ~/.local/share/systemd/user), подключил, запустил - работает. Перегружаюсь - после логина ничего нет. Смотрю логи - conky жалуется, что нет дисплея. То есть мне нужно сделать юнит так, чтобы conky запускался после того, как полностью загрузится десктоп. И не получается. Сделать просто фиксированную задержку при старте (ExecStartPre=/bin/sleep 30) - это как-то костыльно, тогда уж можно было с systemd вообще не заморачиваться. Хочется по правильному. Либо найти правильные зависимости, либо сделать таймер. С зависимостями ничего не получается. И с таймером тоже. Делал примерно как тут: https://askubuntu.com/questions/1083537/how-do-i-properly-install-a-systemd-timer-and-service Но сервис не стартует. Не подскажете, что исправить? Может быть у кого-то уже ест нормальный юнит подобного типа? Вставить ник Quote
[anp/hsw] Posted December 29, 2024 Posted December 29, 2024 в systemd не силен, но: у вас возможно просто не задана переменная DISPLAY (DISPLAY=:0.0) можете просто написать скрипт, который по кругу рестартует сервис при падении (while true... и не забыть выключить fork) Вставить ник Quote
alibek Posted December 29, 2024 Author Posted December 29, 2024 В нормальном случае переменная и так передается. А при досрочном запуске это не работает, даже если ее вручную задавать. Скрипт с бесконечным циклом сделать можно, но тогда хочется сделать по правильному, на событиях. В общем, сделал через таймер. Сервис: [Unit] Description=Conky System Monitor StartLimitIntervalSec=300 StartLimitBurst=5 After=graphical.target [Service] Type=forking ExecStart=/usr/bin/conky -d Restart=on-failure RestartSec=5s [Install] WantedBy=graphical.target Таймер (с OnBoot переделал на OnActive): [Unit] Description=Conky System Monitor (delayed) [Timer] OnActiveSec=1min [Install] WantedBy=timers.target Конфиг: conky.config = { -- SYSTEM background = true, cpu_avg_samples = 2, net_avg_samples = 2, diskio_avg_samples = 10, update_interval = 1.0, -- VISUAL double_buffer = true, own_window = true, own_window_class = 'Conky', own_window_type = 'desktop', own_window_argb_visual = true, own_window_argb_value = 160, use_xft = true, border_width = 1, border_inner_margin = 4, border_outer_margin = 4, stippled_borders = 0, draw_borders = false, draw_graph_borders = true, draw_outline = false, draw_shades = false, maximum_width = 450, minimum_width = 450, minimum_height = 100, -- FONTS font = 'DejaVu Sans Mono:size=10', -- default font0 = 'DejaVu Sans Mono:bold:size=10', -- groups font1 = 'Ubuntu:bold:size=10', -- sections font2 = 'Roboto Condensed:size=9', -- small text -- COLORS own_window_colour = '000000', default_outline_color = '808080', default_shade_color = '333333', default_color = 'c0c0c0', color0 = 'ffffff', -- title and groups color1 = '9999cc', -- labels color2 = 'c0e0c0', -- values color3 = '00ffc0', -- graphs color4 = 'd9bc83', -- accent color5 = '00bfff', -- teal color6 = '00c0ff', -- info (blue) color7 = 'c0ff00', -- ok (green) color8 = 'ffa726', -- warning (orange) color9 = 'f1544b', -- critical (firebrick) graph_gradient_mode = 'hsv', -- OPTIONS short_units = true, format_human_readable = true, extra_newline = false, out_to_console = false, out_to_ncurses = false, out_to_stderr = false, out_to_x = true, use_spacer = 'left', pad_percents = 3, show_graph_range = false, show_graph_scale = false, if_up_strictness = 'address', temperature_unit = 'celsius', imlib_cache_size = 0, no_buffers = true, text_buffer_size = 2048, override_utf8_locale = true, -- POSITION gap_x = 25, gap_y = 50, alignment = 'top_right', -- TEMPLATES template1 = [[${font0}${color1}\1${font}${color} ${font2}(${fs_type \1})${font}${alignr}${color2}${fs_used \1}${color} / ${color2}${fs_size \1}${color} ${voffset -4}${fs_bar \1}${voffset -15} ]], template2 = [[${\1 name \2} ${\1 pid \2} ${\1 cpu \2} ${\1 time \2} ${\1 mem \2} ${\1 mem_vsize \2}]], } conky.text = [[ ${voffset 2}${color0}${font1}[SYSTEM] ${color}${hr 2}${font} Hostname: ${alignr}${color2}${nodename}${color} OS: ${alignr}${color2}${execi 6000 lsb_release -d| awk '{$1=""; print $0}'}${color} Kernel: ${alignr}${color2}${kernel}${color} Load average: ${color2}${alignr}${loadavg}${color} Uptime: ${alignr}${color2}${uptime}${color} ${voffset 2}${color0}${font1}[TEMPERATURE] ${color}${hr 2}${font} ACPI: ${color2}${acpitemp}°C${color} ${voffset 2}${color0}${font1}[CPU] ${color}${hr 2}${font} ${execi 3600 lscpu --parse=modelname | tail -1}${alignr}${color2}${freq}MHz${color} ${color2}${cpu}%${color} ${cpugraph cpu0 30,0 00ff00 ff0000 -t} ${color1}¤1${color} ${cpubar cpu1 6,35} ${color2}${cpu cpu1}%${color}${goto 120}${color1}¤3${color} ${cpubar cpu3 6,35} ${color2}${cpu cpu3}%${color}${goto 240}${color1}¤5${color} ${cpubar cpu5 6,35} ${color2}${cpu cpu5}%${color}${goto 360}${color1}¤7${color} ${cpubar cpu7 6,35} ${color2}${cpu cpu7}%${color} ${color1}¤2${color} ${cpubar cpu2 6,35} ${color2}${cpu cpu2}%${color}${goto 120}${color1}¤4${color} ${cpubar cpu4 6,35} ${color2}${cpu cpu4}%${color}${goto 240}${color1}¤6${color} ${cpubar cpu6 6,35} ${color2}${cpu cpu6}%${color}${goto 360}${color1}¤8${color} ${cpubar cpu8 6,35} ${color2}${cpu cpu8}%${color} ${voffset 2}${color0}${font1}[MEMORY] ${color}${hr 2}${font} ${font1}${color0}RAM ${font}${color}${alignc}${color2}${mem}${color} / ${color2}${memmax}${color}${alignr}${color2}${memperc}%${color} ${membar} ${font1}${color0}SWAP ${font}${color}${alignc}${color2}${swap}${color} / ${color2}${swapmax}${color}${alignr}${color2}${swapperc}%${color} ${swapbar} ${voffset 2}${color0}${font1}[STORAGE] ${color}${hr 2}${font} ${font1}Read IO:${font} ${color2}${diskio_read}${color}${alignr}${font1}Write IO:${font} ${color2}${diskio_write}${color} ${diskiograph_read 25,200}${alignr}${diskiograph_write 25,200} ${template1 /} ${template1 /home} ${template1 /data} ${template1 /backup} ${voffset 2}${color0}${font1}[PROCESSES] ${color}${hr 2}${font} Active/Total: ${alignr}${color2}${running_processes}${color} / ${color2}${processes}${color} Top-5 (CPU%) PID CPU% CPU Time MEM% MEM ${template2 top 1} ${template2 top 2} ${template2 top 3} ${template2 top 4} ${template2 top 5} ${voffset 2}${color0}${font1}[NETWORK] ${color}${hr 2}${font} Internal IP: ${alignr}${color2}${addrs eno1}${color} External IP: ${alignr}${color2}${texeci 3600 wget -q -O- https://ipecho.net/plain}${color} ${color1}Upload${color}: ${color2}${upspeed eno1}${color}${alignr}${color1}Download${color}: ${color2}${downspeed eno1}${color} ${upspeedgraph eno1 25,200}${alignr}${downspeedgraph eno1 25,200} ]] Результат: Сейчас все работает, мониторинг стартует примерно через минуту после логина. Автоматом перезапускается при падениях. Если вдруг ошибка фатальная (например некорректный конфиг), то запускаться перестает, после устранения причины нужно сделать systemctl --user reset-failed conky Вставить ник Quote
jffulcrum Posted December 29, 2024 Posted December 29, 2024 3 часа назад, alibek сказал: Результат: Какая пошлятина... Откройте для себя Glances Вставить ник Quote
yandrey Posted December 29, 2024 Posted December 29, 2024 (edited) Странно что "довольно часто вылетает", у меня работает много лет месяцами без перезапуска, вылет может случится при резких изменениях в выводе, но в конфиге ничего подобного не заметно. @jffulcrum пошлятина это GKrellM, а Glances совсем другое ) Edited December 29, 2024 by yandrey Вставить ник Quote
alibek Posted December 29, 2024 Author Posted December 29, 2024 Цитата вылет может случится при резких изменениях в выводе, Ну так я пока конфиг отлаживал, каждое третье сохранение вылетал. Цитата Glances Посмотрю, но это вроде бы совсем другое. Это утилита, которая в своем окне выводит информацию. Соответственно ее нужно запускать, например в screen. А conky рисует поверх десктопа, типа наложение на обои, но динамическое. Вставить ник Quote
jffulcrum Posted December 29, 2024 Posted December 29, 2024 8 часов назад, yandrey сказал: пошлятина это GKrellM Мои глаза! Зачем я посмотрел... Вставить ник Quote
pppoetest Posted December 31, 2024 Posted December 31, 2024 В 28.12.2024 в 21:24, alibek сказал: Не подскажете, что исправить? По идее, гуглить в сторону after Вставить ник Quote
alibek Posted February 24, 2025 Author Posted February 24, 2025 Сейчас сделан такой юнит: ~/.config/systemd/user/conky.service [Unit] Description=Conky System Monitor StartLimitIntervalSec=300 StartLimitBurst=5 After=graphical.target [Service] Type=forking ExecStart=/usr/bin/conky -d Restart=on-failure RestartSec=5s [Install] WantedBy=graphical.target ~/.config/systemd/user/conky.timer [Unit] Description=Conky System Monitor (delayed) [Timer] OnActiveSec=1min [Install] WantedBy=timers.target Юнит пользовательский (не системный), запускается сам после входа (через 5 минут), при необходимости вручную управляется через systemctl (с добавлением ключа --user). Но есть один досадный баг. Если я завершаю сеанс GDM (или подключался по RDP и затем отключился — по умолчанию GDM прибивает все пользовательские процессы), то conky завершает работу, но тут же перезапускается и грузит одно ядро на 100%. Сам при этом не работает и другим не дает — если снова войти в систему, то мониторинга не отображается. Нужно вначале прибить глюкнувший процесс, после чего он автоматически перезапускается нормально. У меня пока что две основные версии. Либо это не совсем правильное поведение systemd и он (пере)запускает conky, когда десктопа уже (или еще) нет, что и приводит к такому поведению. Тогда нужно в описании юнита где-то указать, чтобы он запускался после инициализации десктопа (хотя After=graphical.target по идее именно это и должен делать). Либо это конфликтует системный способ "демонизации" с настройкой "background = true". Хотя пока не могу понять, каким образом conky запускает сам себя после завершения сеанса (тем более запускает под пользовательской учеткой). Не посоветуете, где посмотреть подробнее? Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.