Meu conky , para monitoramento (linux mint)

montei um .sh para monitoramento no conky, ficou assim:

tem 2 versoes, um para VM (esse da imagem) e outro real, o que muda seria somente a temperatura que fica na campo SYSTEM, para identificar separei por campos:

vou detalhar os campos:
1- INFO, nela tem a versao do conky, o nome do usuario, a distro usada e o relogio
2- DATA,mostra o calendario
3- CLIMA,aqui fica o alguns dados do clima, ele busca por IP, entao independe da localidade, mostra o HOJE e o AMANHA, com base no mesmo horario
4- SYSTEM,campo para monitorar alguns campos do sistema
5- HD,como estou usando em VM ele mostra somente o disco 1, mas ele reconhece 3 discos
6- NETWORK,mostra alguns dados da rede

no final deixei o monitoramento de CPU e MEM.

aqui a estrutura dos arquivos:


vou descrever o que seriam as nomenclaturas:
1-2-3-4-5-6-7-8
ficou para cada campo

c = conteudo
t = texto
tc = texto/conteudo

os outros sao .sh ou .lua para carregar nos campos

esse seria o .sh:

https://mystb.in/b98a289cd3d8d745a6?pastePassword=conky

como o arquivo ficou grande coloquei no mystbin, mas ele faz a maioria das coisas sozinho.
o que muda seria somente o começo ate chegar no primeiro EOF.

tem alguma sugestao para melhora?

esqueci de mencionar, esse versao seria para 1366x768
outras resolucoes podem estragar o posicionamento,
e para o mint, que usa de base o ububtu, se usar algo diferente do X11 algumas coisas podem nao funcionar.

outra coisa, ele cria pastas, entao deve mudar a permissao dele:

chmod+x conky_VMmint_v21_1366x768.sh

fiz alguns updates no campo HD
o mystb.in esta reiniciando muito, caso queira um campo especifico coloco aqui,
nao coloquei tudo direto no forum pois excedeu o limite de caracteres… :slightly_frowning_face:

https://mystb.in/02e607b5749b07b98f?pastePassword=123456

Ocorreu um erro: Corpo está limitado para 32000 caracteres. 
Você digitou 89557.

Não tenho mais paciência de ficar configurando sistemas e aplicativos.

Mas ficou legal

:+1:

Aqui já tenho tudo salvo. É copiar e colar.

O conky aqui no Arch funciona perfeito, exceto o bargraph.lua, mesmo com o lua-nv e cairo instalados.

funciona diferente para X11 e wayland,
no mint funcionava o .lua, no fedora ele nao aparecia, tive que mudar.

Ficou muito legal!

Gosto muito do Conky.

O meu aqui é bem mais simples que o seu. Tem apenas o essencial pra mim.

Dividi as coisas entre 2 instâncias do Conky + Calendário + Weather + Luna:

mudei somente o CLIMA, outros campos continuam o mesmo, era assim:

ficou assim:

antes mostrava o “agora” e a “previsao” para o amanha,
agora mostra o “agora”, a “previsao1” e a “previsao2”
para usar o mesmo espaco, tive que alterar o conteudo,

esta dividido em 2 partes, o .sh e o .config
o .sh seria responsavel por pegar os dados,
o .config somente mostra no conky.

o .sh para o “agora”
https://mystb.in/9ee61013fa8464c5eb
o .sh para a previsao1
https://mystb.in/033c9f8a8be1bc9a99
o .sh para a previsao2
https://mystb.in/52eeab0a57c81460a5

os .configs
Clima1
https://mystb.in/9163fbc622c9026016
Clima2
https://mystb.in/bace109a1ee10b23a9
Clima3
https://mystb.in/b042443e3dbc77f9a2

para pegar a latitude e a longitude uso esse site:
https://www.latlong.net/
no .sh colocando somente o nome ele nao reconhece, tem que ser lat/lon.

Quando tento ver esta pedindo senha…

ah sim, as senhas sao bem dificeis: 123456

o mystb.in estava com instabilidade do cloudflare

mudei somente o campo do HD

estava assim:

ficou assim:

esse seria os conteudos:

4c_hd1_1366x768.config
.CONFIG
https://mystb.in/6bd9dc6999f324a99c?pastePassword=123456
.SH
https://mystb.in/037abbab89a8fecb83?pastePassword=123456

4c_hd1_graph_1366x768.config
.CONFIG
https://mystb.in/bcee22abbc2c373cdc?pastePassword=123456
.SH
https://mystb.in/f46b379a82c109efac?pastePassword=123456
4c_hd2_1366x768.config
.CONFIG
https://mystb.in/3010368ce6a1150967?pastePassword=123456
.SH
https://mystb.in/fda98fc7e0faa81d97?pastePassword=123456

4c_hd2_graph_1366x768.config
.CONFIG
https://mystb.in/613a9650cb5f51a122?pastePassword=123456
.SH
https://mystb.in/ee670a6b94c1c70c1b?pastePassword=123456
4c_hd3_1366x768.config
.CONFIG
https://mystb.in/08bead7884a7f67b0a?pastePassword=123456
.SH
https://mystb.in/d033cd79ca0dddbc76?pastePassword=123456

4c_hd3_graph_1366x768.config
.CONFIG
https://mystb.in/2be805267a3a7fca74?pastePassword=123456
.SH
https://mystb.in/cc01d5cb76f59da3a3?pastePassword=123456

inteiro esta assim:

retirei alguns monitoramentos em “real time” e o processamento foi de 10% para 1%

em repouso ele chega a 0%

no manjaro ele fica em 0%

vou testar mais no arch

ah sim, no manjaro ele nao funciona o .lua
ele so funciona no mint :smiling_face_with_tear:

mudei novamente,
o processamento realmente estava em 1%, mas o consumo de memoria ia pro espaco,

tive que criar somente 1 conky com tudo dentro, o update ficou 1s para tudo, mas coloquei para ele executar algumas coisas poucas vezes,
assim o consumo da memoria foi la pra baixo…

quem quiser o conky seria esse:

conky.config = {
    -- Geral
    background = true,
    update_interval = 1,
    total_run_times = 0,

    -- Otimização de Performance
    double_buffer = true,
    no_buffers = true,
    text_buffer_size = 512,

    -- Janela
    own_window = true,
    own_window_type = 'desktop',
    own_window_transparent = false,
    own_window_colour = '#000000',
    own_window_hints = 'undecorated,below,sticky,skip_taskbar,skip_pager',
    own_window_argb_visual = false,

    -- Posição
    alignment = 'top_right',
    gap_x = 0,
    gap_y = 0,

    -- Tamanho
    minimum_width = 280,
    maximum_width = 300,

    -- Texto
    use_xft = true,
    font = 'Open Sans:normal:size=8',
    default_color = 'white',
    override_utf8_locale = true,

    -- Gráficos
    draw_shades = false,
    draw_outline = false,
    draw_borders = false,
    draw_graph_borders = true,
    stippled_borders = 0,
    border_width = 0,

    -- Processamento
    cpu_avg_samples = 3,
    diskio_avg_samples = 2,
    net_avg_samples = 2,
};

conky.text = [[
# === INFO ===
${font Zekton:Bold:size=12}INFO: ${hr 2}${font}
${voffset -20}
${offset 52}${font sans-serif:normal:size=7}${execi 86400 echo "Conky $(conky -v | awk '/^conky [0-9]/ {print $2}')"}
${offset 52}${execi 86400 echo "$(uname -n) ($(uname -r | cut -d'-' -f1))"}
${offset 52}${execi 86400 lsb_release -ds}${font}
${voffset -50}${offset 130}${font Roboto Mono:style=Bold:size=31}${time %H:%M:%S}${voffset -100}

# === DATA ===
${font Zekton:Bold:size=12}DATA: ${hr 2}${font}
${alignc}${font DejaVu Sans Mono:size=10}${execi 86400 LC_ALL=C date +"%B (%-m)" | sed 's/January/Janeiro/;s/February/Fevereiro/;s/March/Março/;s/April/Abril/;s/May/Maio/;s/June/Junho/;s/July/Julho/;s/August/Agosto/;s/September/Setembro/;s/October/Outubro/;s/November/Novembro/;s/December/Dezembro/'} ${time %Y}${voffset 2}
${font DejaVu Sans Mono:size=12}${execpi 86400 ~/.conky/cal.sh}${voffset -1}

# === CLIMA ===
${voffset -26}${font Zekton:Bold:size=12}CLIMA: ${hr 2}${font}${voffset -20}

# === CLIMA: HOJE ===
${offset 10}${font Open Sans:size=10}${execi 3600 date "+%A" | sed -E 's/(Sunday|domingo)/domingo/; s/(Monday|segunda)/segunda/; s/(Tuesday|terça)/terca/; s/(Wednesday|quarta)/quarta/; s/(Thursday|quinta)/quinta/; s/(Friday|sexta)/sexta/; s/(Saturday|sábado)/sabado/'}/hoje${font}
${voffset 4}${offset 29}${font Noto Color Emoji:size=21}${execi 900 ${HOME}/.conky/clima.sh --hoje --icon}${font}
${voffset 4}${offset 24}${font Rounded Elegance:size=7}${execi 900 ${HOME}/.conky/clima.sh --hoje --desc}${font}
${voffset -4}${offset 33}${font Rounded Elegance:style=Bold:size=10}${execi 900 ${HOME}/.conky/clima.sh --hoje --temp}${font}
${voffset -4}${offset 7}${font DejaVu Sans Mono:size=7}${execi 900 ${HOME}/.conky/clima.sh --hoje --wind-deg}${offset 4}${execi 900 ${HOME}/.conky/clima.sh --hoje --wind-spd}Km/h ${offset -1}${execi 900 ${HOME}/.conky/clima.sh --hoje --humidity}
${voffset -2}${offset 3}${color orange}Up:${color}${execi 900 ${HOME}/.conky/clima.sh --hoje --last-update}${font}

# === CLIMA: AMANHÃ ===
${voffset -131}${offset 130}${font Open Sans:size=10}${execi 3600 date "+%A" | sed -E 's/(Sunday|domingo)/domingo/; s/(Monday|segunda)/segunda/; s/(Tuesday|terça)/terca/; s/(Wednesday|quarta)/quarta/; s/(Thursday|quinta)/quinta/; s/(Friday|sexta)/sexta/; s/(Saturday|sábado)/sabado/'}${font}
${voffset 4}${offset 133}${font Noto Color Emoji:size=21}${execi 900 ${HOME}/.conky/clima.sh --amanha --icon}${font}
${voffset 4}${offset 128}${font Rounded Elegance:size=7}${execi 900 ${HOME}/.conky/clima.sh --amanha --desc}${font}
${voffset -4}${offset 137}${font Rounded Elegance:style=Bold:size=10}${execi 900 ${HOME}/.conky/clima.sh --amanha --temp}${font}
${voffset -4}${offset 110}${font DejaVu Sans Mono:size=7}${execi 900 ${HOME}/.conky/clima.sh --amanha --wind-deg}${offset 4}${execi 900 ${HOME}/.conky/clima.sh --amanha --wind-spd}Km/h ${offset -1}${execi 900 ${HOME}/.conky/clima.sh --amanha --humidity}
${voffset -2}${offset 103}${color orange}Up:${color}${execi 900 ${HOME}/.conky/clima.sh --amanha --last-update}${font}

# === CLIMA: DEPOIS ===
${voffset -131}${offset 232}${font Open Sans:size=10}${execi 3600 date "+%A" | sed -E 's/(Sunday|domingo)/domingo/; s/(Monday|segunda)/segunda/; s/(Tuesday|terça)/terca/; s/(Wednesday|quarta)/quarta/; s/(Thursday|quinta)/quinta/; s/(Friday|sexta)/sexta/; s/(Saturday|sábado)/sabado/'}${font}
${voffset 4}${offset 232}${font Noto Color Emoji:size=21}${execi 900 ${HOME}/.conky/clima.sh --depois --icon}${font}
${voffset 4}${offset 227}${font Rounded Elegance:size=7}${execi 900 ${HOME}/.conky/clima.sh --depois --desc}${font}
${voffset -4}${offset 236}${font Rounded Elegance:style=Bold:size=10}${execi 900 ${HOME}/.conky/clima.sh --depois --temp}${font}
${voffset -4}${offset 210}${font DejaVu Sans Mono:size=7}${execi 900 ${HOME}/.conky/clima.sh --depois --wind-deg}${offset 4}${execi 900 ${HOME}/.conky/clima.sh --depois --wind-spd}Km/h ${offset -1}${execi 900 ${HOME}/.conky/clima.sh --depois --humidity}
${voffset -2}${offset 210}${color orange}Up:${color}${execi 900 ${HOME}/.conky/clima.sh --depois --last-update}${font}

# === CLIMA: DIVISORIA ===
${voffset -124}${offset 90}${font DejaVu Sans Mono:size=20}${color FFFFFF}│
${voffset -1}${offset 90}│
${voffset -1}${offset 90}│
${voffset -19}${offset 90}│${font}
#
${voffset -106}${offset 192}${font DejaVu Sans Mono:size=20}${color FFFFFF}│
${voffset -1}${offset 192}│
${voffset -1}${offset 192}│
${voffset -19}${offset 192}│${font}

# === CPU ===
${voffset -13}${font Zekton:Bold:size=12}SISTEMA: ${hr 2}${font}${voffset -15}

# === CPU: LATERAL ===
${offset 160}${color orange}CPU: ${color}${execi 86400 bash ~/.conky/cpu_summary.sh}
${offset 187}${execi 86400 lscpu | awk -F': +' '/Model name/ {print $2}' | grep -oE '[0-9](\.[0-9]+)? *GHz' || awk '/cpu MHz/ {printf "%.2f GHz\n", $4/1000; exit}' /proc/cpuinfo} ${execi 86400 nproc} Cores ${execi 86400 bash ~/.conky/cpu_gen.sh}
${offset 160}${color orange}Total: ${color}${cpu cpu0}% ${goto 221}${cpubar 5,80}
#
${voffset -9}${offset 160}${hr}
#
${offset 160}${color orange}RAM: ${color}${mem} / ${memmax}
${offset 160}${color orange}Total: ${color}${memperc}%${goto 221}${membar 5,80}
#
${voffset -9}${offset 160}${hr}
#
${offset 160}${color orange}SWAP: ${color}${swap} / ${swapmax}
${offset 160}${color orange}Total: ${color}${swapperc}%${goto 221}${swapbar 5,80}
#
${voffset -9}${offset 160}${hr}
#
${offset 160}${color orange}Bat:${color} ${execi 3 ${HOME}/.conky/bateria.sh --status}
${offset 160}${color orange}Total:${color} ${execi 3 ${HOME}/.conky/bateria.sh}%${goto 221}${execbar 5,80 ${HOME}/.conky/bateria.sh}

# === CPU: GRAPH  ===
${voffset -180}${offset 45}${execi 1 t=$(~/.conky/detectar_temp.sh); [ -n "$t" ] && echo "${t}°C" || echo "N/A"}
${cpugraph 132,105}

# === CPU: DIVISORIA ===
${voffset -180}${offset 130}${font DejaVu Sans Mono:size=20}${color FFFFFF}│
${voffset -1}${offset 130}│
${voffset -1}${offset 130}│
${voffset -1}${offset 130}│
${voffset -1}${offset 130}│${font}

# === HD ===
${voffset -13}${font Zekton:Bold:size=12}HD: ${hr 2}${font}
${color orange}Disk 01: ${color}${execi 86400 ~/.conky/detectar_hd.sh 1 --texto}
${execp ~/.conky/detectar_hd.sh 1 --grafico}
#
${voffset -9}${hr}
#
${color orange}Disk 02: ${color}${execi 86400 ~/.conky/detectar_hd.sh 2 --texto}
${execp ~/.conky/detectar_hd.sh 2 --grafico}
${voffset -9}${hr}
#
${color orange}Disk 03: ${color}${execi 86400 ~/.conky/detectar_hd.sh 3 --texto}
${execp ~/.conky/detectar_hd.sh 3 --grafico}

# === NETWORK ===
${voffset -19}${font Zekton:Bold:size=12}NETWORK: ${hr 2}${font}
${voffset -19}
Loc. IP: ${execpi 86400 bash ~/.conky/get_ip.sh --local}
Ext. IP: ${execpi 86400 bash ~/.conky/get_ip.sh --externo}

${voffset -50}${offset 130}${execpi 86400 bash ~/.conky/get_net_stats.sh --velocidades}
${offset 130}${execpi 86400 bash ~/.conky/get_net_stats.sh --totais}

# === PROCESSO ===
${voffset -37}
${font sans-serif:normal:size=5}CPU / TOTAL: ${processes} processes ${offset 100}MEM${font}
${voffset -23}
${goto 0}${top pid 1} ${goto 40}${top cpu 1}%${goto 85}${top name 1 10}${goto 165}${top_mem mem 1}%${goto 210}${top_mem name 1 10}
${goto 0}${top pid 2} ${goto 40}${top cpu 2}%${goto 85}${top name 2 10}${goto 165}${top_mem mem 2}%${goto 210}${top_mem name 2 10}

${voffset -843}
]]

esses os .sh
ah sim, tem que ter a pasta .conky e dentro a pasta cache,
senao alguns .sh que precisam dessa pasta nao irao funcionar

bateria.sh
#!/bin/bash
export LC_NUMERIC=C

# Detecta bateria
BAT_NAME=$(ls /sys/class/power_supply/ | grep -E '^BAT|^battery' | head -n1)

# Se não tem bateria
if [ -z "$BAT_NAME" ]; then
    if [ "$1" = "--status" ]; then
        echo "Disconnected"
    else
        echo "0"
    fi
    exit 0
fi

# Coleta dados
STATUS=$(cat "/sys/class/power_supply/$BAT_NAME/status" 2>/dev/null | tr 'A-Z' 'a-z')
[ "$STATUS" = "charged" ] || [ "$STATUS" = "full" ] && STATUS="full"
TIME=$(acpi -b 2>/dev/null | grep -oE '[0-9]{2}:[0-9]{2}' | head -n1)
PERCENT=$(cat "/sys/class/power_supply/$BAT_NAME/capacity" 2>/dev/null)

# Responde baseado no argumento
if [ "$1" = "--status" ]; then
    echo "${STATUS}${TIME:+ (${TIME})}"
else
    echo "${PERCENT:-0}"
fi
===========================
clima.sh
#!/bin/bash
export LC_NUMERIC=C

# === CONFIGURAÇÕES ===
CACHE="$HOME/.conky/cache/clima.json"
CACHE_TIME=840          # 14 minutos — EXPIRA ANTES DO UPDATE DO CONKY (900s)
LOG_FILE="$HOME/.conky/logs/weather.log"
LAT="-21.1770"
LON="-47.8103"

mkdir -p ~/.conky/cache ~/.conky/logs

log() { echo "[$(date '+%H:%M:%S')] $$ $1" >> "$LOG_FILE"; }

# === FUNÇÃO: OBTER JSON (cache ou fetch) ===
get_json() {
    # Tenta cache primeiro
    if [ -f "$CACHE" ]; then
        age=$(( $(date +%s) - $(stat -c %Y "$CACHE") ))
        if [ "$age" -lt "$CACHE_TIME" ]; then
            cat "$CACHE"
            return 0
        fi
        log "Cache expirado (${age}s > ${CACHE_TIME}s)"
    else
        log "Nenhum cache existente"
    fi

    # Cache inválido/expirado → busca novo
    log "Fetch API Open-Meteo..."
    resp=$(curl -s --connect-timeout 15 --max-time 30 \
        "https://api.open-meteo.com/v1/forecast?latitude=$LAT&longitude=$LON&hourly=temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,relative_humidity_2m,is_day&timezone=America/Sao_Paulo&forecast_days=3" 2>/dev/null)

    if [ -n "$resp" ] && echo "$resp" | jq . >/dev/null 2>&1; then
        # Escrita atômica (evita corrupção por concorrência)
        tmp="${CACHE}.tmp.$$"
        echo "$resp" > "$tmp" && mv "$tmp" "$CACHE" 2>/dev/null
        log "Cache保存 OK ($(echo "$resp" | wc -c) bytes)"
        echo "$resp"
        return 0
    else
        log "Fetch falhou — tentando cache antigo como fallback"
        if [ -f "$CACHE" ]; then
            cat "$CACHE"
            return 0
        fi
        return 1
    fi
}

# === FUNÇÃO: EXTRAIR DADOS POR HORA ===
extract() {
    local day_flag=$1
    local hour_prefix

    case "$day_flag" in
        --hoje)   hour_prefix=$(date +"%Y-%m-%dT%H") ;;
        --amanha) hour_prefix=$(date -d "tomorrow" +"%Y-%m-%dT%H") ;;
        --depois) hour_prefix=$(date -d "+2 days" +"%Y-%m-%dT%H") ;;
        *) echo ""; return ;;
    esac

    echo "$JSON" | jq -r --arg H "$hour_prefix" '
        .hourly.time as $times
        | ($times | map(startswith($H)) | index(true)) as $idx
        | (if $idx == null then ($times | length - 1) else $idx end) as $i
        | [
            .hourly.temperature_2m[$i],
            .hourly.weather_code[$i],
            .hourly.wind_speed_10m[$i],
            .hourly.wind_direction_10m[$i],
            .hourly.relative_humidity_2m[$i],
            .hourly.is_day[$i]
        ] | @tsv' 2>/dev/null
}

# === OBTÉM O JSON ===
JSON=$(get_json)
if [ -z "$JSON" ]; then
    log "SEM DADOS — output fallback"
    case "$2" in
        --icon) echo "🌈" ;;
        --temp) echo "N/A" ;;
        --desc) echo "Sem Rede" ;;
        --wind) echo "N/A" ;;
        --humidity) echo "N/A" ;;
        --last-update) echo "Sem Rede" ;;
    esac
    exit 0
fi

log "JSON OK — extraindo '$1 $2'"

# === EXTRAI LINHA DE DADOS ===
DATA=$(extract "$1")

# Parse dos campos (TSV)
IFS=$'\t' read -r tempC wcode wspd wdir hum isday <<< "$DATA"

# Sanitização
tempC=${tempC:-0}
wcode=${wcode:-0}
wspd=${wspd:-0}
wdir=${wdir:-0}
hum=${hum:-0}
isday=${isday:-1}

[[ "$tempC" == "null" ]] && tempC=0
[[ "$wcode" == "null" ]] && wcode=0
[[ "$wspd" == "null" ]] && wspd=0
[[ "$wdir" == "null" ]] && wdir=0
[[ "$hum" == "null" ]] && hum=0
[[ "$isday" == "null" ]] && isday=1

# === RETORNO PARA CONKY ===
case "$2" in
    --icon)
        case "$wcode" in
            0) [ "$isday" = "1" ] && echo "☀️" || echo "🌙" ;;
            1|2|3) [ "$isday" = "1" ] && echo "⛅" || echo "☁️" ;;
            45|48) echo "🌫️" ;;
            51|53|55|56|57|61|63|65|66|67|80|81|82) echo "🌧️" ;;
            71|73|75|77|85|86) echo "❄️" ;;
            95|96|99) echo "⛈️" ;;
            *) echo "🌈" ;;
        esac
        ;;
    --temp)
        if [[ "$tempC" =~ ^-?[0-9]+\.?[0-9]*$ ]]; then
            printf "%.0f°C" "$tempC"
        else
            echo "N/A"
        fi
        ;;
    --desc)
        case "$wcode" in
            0) echo "Ceu Limpo" ;;
            1) echo "Quase Limpo" ;;
            2) echo "Parc. Nub." ;;
            3) echo "Nublado" ;;
            45) echo "Neblina" ;;
            48) echo "Nevoeiro" ;;
            51|53|55) echo "Garoa" ;;
            61|63|65) echo "Chuva" ;;
            80|81|82) echo "Pancadas" ;;
            95|96|99) echo "Trovoada" ;;
            *) echo "Sem Rede" ;;
        esac
        ;;
    --wind-deg)
        if [[ "$wspd" =~ ^-?[0-9]+\.?[0-9]*$ ]]; then
            printf "%.0f°" "$wdir"
        else
            echo "N/A"
        fi
        ;;
    --wind-spd)
        if [[ "$wspd" =~ ^-?[0-9]+\.?[0-9]*$ ]]; then
            printf "%.0f" "$wspd"
        else
            echo "N/A"
        fi
        ;;
    --humidity)
        if [[ "$hum" =~ ^-?[0-9]+\.?[0-9]*$ ]]; then
            printf "%.0f%%" "$hum"
        else
            echo "N/A"
        fi
        ;;
    --last-update)
        if [ -f "$CACHE" ]; then
            date "+%H:%M-%d/%m" -r "$CACHE"
        else
            echo "Sem Rede"
        fi
        ;;
    *)
        echo ""
        ;;
esac

log "END '$2'"
exit 0
===========================
cpu_gen.sh
#!/bin/bash

cpu_line=$(grep -m1 "model name" /proc/cpuinfo)
cpu_model=$(echo "$cpu_line" | sed -E 's/^.*: //')

# Intel Core iX
if [[ "$cpu_model" =~ ([iI][3579])-([0-9]{4,5}) ]]; then
    series=${BASH_REMATCH[2]}
    if [[ ${#series} -eq 5 ]]; then
        gen=${series:0:2}
    else
        gen=${series:0:1}
    fi
    case $gen in
        1) suffix="st";;
        2) suffix="nd";;
        3) suffix="rd";;
        *) suffix="th";;
    esac
    echo "${gen}${suffix} Gen"
    exit 0
fi

# AMD Ryzen
if [[ "$cpu_model" =~ [Rr]yzen[[:space:]]*[3579]?[[:space:]]*([0-9]{4}) ]]; then
    model_num=${BASH_REMATCH[1]}
    gen=${model_num:0:1}
    case $gen in
        1) suffix="st";;
        2) suffix="nd";;
        3) suffix="rd";;
        *) suffix="th";;
    esac
    echo "${gen}${suffix} Gen"
    exit 0
fi

# Apple Silicon ou ARM
arch=$(uname -m)
if [[ "$arch" == "arm64" || "$arch" == "aarch64" ]]; then
    echo "ARM"
    exit 0
fi

# Fallback
echo ""
===========================
cpu_summary.sh
#!/bin/bash

cpu_raw=$(grep -m1 "model name" /proc/cpuinfo)

if [ -z "$cpu_raw" ]; then
    cpu_raw=$(grep -m1 -E 'Hardware|Processor|CPU architecture' /proc/cpuinfo)
fi

if [ -z "$cpu_raw" ]; then
    cpu_raw=$(lscpu | grep -m1 'Model name' | sed -E 's/^.*: //')
fi

if [ -z "$cpu_raw" ]; then
    cpu_raw="CPU desconhecida"
fi

cpu_raw=$(echo "$cpu_raw" | sed -E '
    s/AuthenticAMDAMD/AMD/g;     # Remove duplicação e Authentic
    s/AuthenticAMD/AMD/g;        # Remove Authentic (se só AuthenticAMD)
    s/ D Ryzen/ Ryzen/g           # Remove "D" estranho
')

cpu_model=$(echo "$cpu_raw" | sed -E '
    s/^.*: //;
    s/\(R\)|\(TM\)|\(C\)//g;
    s/ CPU//g;
    s/@.*//;
    s/ with.*//;
    s/^[0-9]+(th|st|nd|rd) Gen //;
    s/ +/ /g;
    s/^ +| +$//g
')

echo "$cpu_model"
===========================
detectar_hd.sh
#!/bin/bash
export LC_NUMERIC=C

# Se não passar os parâmetros obrigatórios, encerra
if [ -z "$1" ] || [ -z "$2" ]; then
    echo "Uso: $0 <1|2|3> <--texto|--grafico>"
    exit 1
fi

NUM_HD="$1"
TIPO_REQ="$2"
idx=$((NUM_HD - 1))

# 1. Captura todos os discos físicos do sistema ordenados dinamicamente
mapfile -t ALL_DISKS < <(/usr/bin/lsblk -dno name | grep -E 'sd|nvme|vd' | sort)

# 2. Captura os sensores de temperatura drivetemp
mapfile -t ALL_HWMONS < <(for i in /sys/class/hwmon/hwmon*/name; do 
    if [ "$(cat "$i" 2>/dev/null)" = "drivetemp" ]; then 
        echo "$i" | grep -oE '[0-9]+'
    fi
done)

disk_name="${ALL_DISKS[$idx]}"
hwmon_num="${ALL_HWMONS[$idx]}"
[ -z "$hwmon_num" ] && hwmon_num=$idx

# === SE O DISCO EXISTE ===
if [ -n "$disk_name" ]; then

    # --- PROCESSA LINHA 1: TEXTO ---
    if [ "$TIPO_REQ" = "--texto" ]; then
        disk_model=""

        # Leitura Direta e Pura do Sysfs (Provou funcionar no seu terminal)
        if [ -r "/sys/class/block/$disk_name/device/model" ]; then
            raw_model=$(cat "/sys/class/block/$disk_name/device/model" 2>/dev/null)
            # Remove espaços extras no início e fim usando apenas recursos nativos do Bash
            disk_model=$(echo $raw_model)
        fi

        # Fallback 1: Se o de cima falhar (como em NVMes que usam caminhos diferentes)
        if [ -z "$disk_model" ] || [ "$disk_model" = "none" ]; then
            raw_model=$(/usr/bin/lsblk -dno MODEL "/dev/$disk_name" 2>/dev/null)
            disk_model=$(echo $raw_model)
        fi
        
        # Fallback 2: Validação dinâmica para ambientes Virtuais (VirtualBox / KVM)
        if [ -z "$disk_model" ] || [ "$disk_model" = "none" ]; then
            if [[ "$disk_name" == vd* ]]; then
                disk_model="KVM VirtIO Disk"
            elif [ -d /sys/module/vboxguest ]; then
                disk_model="VBOX HARDDISK"
            else
                disk_model="Disk ${disk_name^^}"
            fi
        fi

        # Captura o tamanho do disco de forma limpa
        raw_bytes=$(/usr/bin/lsblk -bdno SIZE "/dev/$disk_name" | tr -cd '[:digit:]')
        if [ -n "$raw_bytes" ] && [ "$raw_bytes" -gt 0 ]; then
            disk_size=$(awk "BEGIN {printf \"%.1f GiB\", $raw_bytes / 1024 / 1024 / 1024}")
        else
            disk_size="0.0 GiB"
        fi

        echo "${disk_model} (${disk_size})"
        exit 0
    fi

    # --- PROCESSA LINHA 2: GRAFICO ---
    if [ "$TIPO_REQ" = "--grafico" ]; then
        mount_point=$(/usr/bin/lsblk -ln -o MOUNTPOINT,SIZE -b "/dev/$disk_name" | grep -v '^$' | sort -nk2 | tail -n1 | awk '{print $1}')
        
        if [ -z "$mount_point" ] || [ "$mount_point" = "part" ]; then
            mount_point=$(ls -d /mnt/conky_disks/"$disk_name"/"$disk_name"* 2>/dev/null | head -n1)
        fi

        if [ "$NUM_HD" -eq 1 ] && { [ -z "$mount_point" ] || [ "$mount_point" = "part" ]; }; then
            mount_point="/"
        fi

        if [ -n "$mount_point" ] && [ "$mount_point" != "part" ]; then
            if [ "$NUM_HD" -eq 3 ] ; then
                echo "\${fs_used $mount_point} / \${fs_size $mount_point} (\${fs_used_perc $mount_point}%)\${goto 135}\${fs_bar 5,40 $mount_point}\${goto 212}I/O:\${alignr}\${diskio $disk_name}"
            else
                PARTE_1="\${fs_used $mount_point} / \${fs_size $mount_point} (\${fs_used_perc $mount_point}%)"
                PARTE_2="\${goto 135}\${fs_bar 5,40 $mount_point}"
                PARTE_3="\${goto 180}\${hwmon $hwmon_num temp 1}°C\${goto 212}I/O:\${alignr}\${diskio $disk_name}"
                echo "${PARTE_1}${PARTE_2}${PARTE_3}"
            fi
        else
            if [ "$NUM_HD" -eq 3 ]; then
                echo "Unmounted\${goto 135}\${execbar 5,40 echo 0}\${goto 212}I/O:\${alignr}\${diskio $disk_name}"
            else
                echo "Unmounted\${goto 135}\${execbar 5,40 echo 0}\${goto 180}\${hwmon $hwmon_num temp 1}°C\${goto 212}I/O:\${alignr}\${diskio $disk_name}"
            fi
        fi
        exit 0
    fi

# === SE O DISCO NÃO EXISTE ===
else
    if [ "$TIPO_REQ" = "--texto" ]; then
        echo "None (0.0 GiB)"
    elif [ "$TIPO_REQ" = "--grafico" ]; then
        if [ "$NUM_HD" -eq 3 ]; then
            echo "0.0 GiB / 0.0 GiB (0%)\${goto 135}\${execbar 5,40 echo 0}\${goto 212}I/O:\${alignr}0B"
        else
            echo "0.0 GiB / 0.0 GiB (0%)\${goto 135}\${execbar 5,40 echo 0}\${goto 180}°C\${goto 212}I/O:\${alignr}0B"
        fi
    fi
    exit 0
fi
===========================
detectar_temp.sh
#!/bin/bash
# Procura pelo sensor do processador e extrai apenas os números redondos
sensors 2>/dev/null | awk -F'[:+.]' '/(Package id 0|Core 0|CPU)/ {print $3; exit}' | tr -d ' '
===========================
get_ip.sh
#!/bin/bash

# 1. Detecta dinamicamente a interface ativa
INTERFACE=$(ip route | grep '^default' | awk '{print $5}' | head -n1)

if [ -z "$INTERFACE" ]; then
    INTERFACE=$(ip -br link show | grep -v -E 'lo|virbr|docker' | awk '{print $1}' | head -n1)
fi
[ -z "$INTERFACE" ] && INTERFACE="lo"

# 2. Responde com o IP direto de acordo com o parâmetro
if [ "$1" = "--local" ]; then
    # Pega o IP real da interface removendo máscaras e espaços
    LOCAL_IP=$(ip -4 addr show dev "$INTERFACE" 2>/dev/null | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | head -n1)
    [ -z "$LOCAL_IP" ] && LOCAL_IP="Desconectado"
    echo "$LOCAL_IP"

elif [ "$1" = "--externo" ]; then
    EXT_IP=$(curl -s --max-time 3 ipinfo.io/ip)
    [ -z "$EXT_IP" ] && EXT_IP="Offline"
    echo "$EXT_IP"
fi

exit 0
EOF

cat << 'EOF' > ~/.conky/get_net_stats.sh
#!/bin/bash

# 1. Detecta dinamicamente a interface ativa
INTERFACE=$(ip route | grep '^default' | awk '{print $5}' | head -n1)

if [ -z "$INTERFACE" ]; then
    INTERFACE=$(ip -br link show | grep -v -E 'lo|virbr|normaler' | awk '{print $1}' | head -n1)
fi
[ -z "$INTERFACE" ] && INTERFACE="lo"

# 2. Retorna a linha solicitada com um GOTO absoluto (somado ao offset do .config)
if [ "$1" == "--velocidades" ]; then
    # \${goto 240} joga o D para uma posição fixa na tela
    echo "\${if_match \${upspeedf $INTERFACE} > 0}\${color 0BF14A}\${else}\${color red}\${endif}U:\${color} \${upspeed $INTERFACE}/s\${goto 220}\${if_match \${downspeedf $INTERFACE} > 0}\${color 0BF14A}\${else}\${color red}\${endif}D:\${color} \${downspeed $INTERFACE}/s"
elif [ "$1" == "--totais" ]; then
    # \${goto 240} trava o Total Down exatamente embaixo do D
    echo "\${color}Total: \${totalup $INTERFACE}\${goto 220}Total: \${totaldown $INTERFACE}"
fi

exit 0
===========================
mount_all_disks_ro.sh
#!/bin/bash
# Monta todas as partições de todos os discos como somente leitura
# Para uso via botão no Conky Manager 2

BASE_MOUNT="/mnt/conky_disks"
mkdir -p "$BASE_MOUNT"

# Detecta todos os discos físicos (exceto loop e pendrive)
DISKS=$(lsblk -dn -o NAME,TYPE | awk '$2=="disk"{print $1}')

for disk in $DISKS; do
    PARTS=$(lsblk -ln -o NAME "/dev/$disk" | tail -n +2)
    DISK_MOUNT="$BASE_MOUNT/$disk"
    mkdir -p "$DISK_MOUNT"

    for part in $PARTS; do
        MOUNTPOINT=$(lsblk -ln -o MOUNTPOINT "/dev/$part")
        TMP_MOUNT="$DISK_MOUNT/$part"
        mkdir -p "$TMP_MOUNT"

        # Se não estiver montada, monta somente leitura
        if [[ -z "$MOUNTPOINT" ]]; then
            sudo mount -o ro "/dev/$part" "$TMP_MOUNT" 2>/dev/null
            if [[ $? -eq 0 ]]; then
                echo "Montado /dev/$part em $TMP_MOUNT (somente leitura)"
            fi
        else
            echo "/dev/$part já está montada em $MOUNTPOINT"
        fi
    done
done

echo "Todas as partições montadas como somente leitura."
===========================
cal.sh
##!/bin/bash
# Script: cal.sh - Versão com cabeçalho de dias fixo e corrigido

DIA_ATUAL=$(date +%-d)
AJUSTE_Y="-4"      # Ajuste inicial para desgrudar do elemento de cima
ESPACO_DIAS="-2"    # Espaçamento dos dias

verde='${color green}'
azul='${color #87CEEB}'
azul_opaco='${color #4A7282}' 
branco='${color white}'
cinza='${color #7a7a7a}'

# --- DETECÇÃO AUTOMÁTICA DO COMANDO ---
if command -v ncal >/dev/null 2>&1; then
    # Força o ncal a começar na segunda-feira (-M) para alinhar com o cabeçalho
    DADOS_CAL=$(ncal -b -h -M)
else
    DADOS_CAL=$(cal -m --color=never)
fi

# Processa os dados
echo "$DADOS_CAL" | sed 's/\x1b[[0-9;]*m//g' | awk -v d="$DIA_ATUAL" -v v="$verde" -v a="$azul" -v ao="$azul_opaco" -v w="$branco" -v c="$cinza" \
-v vo="\${voffset $AJUSTE_Y}" -v vd="\${voffset $ESPACO_DIAS}" -v al="\${alignc}" '
BEGIN {
    # Cabeçalho manual corrigido com Quinta (qi) e Sexta (sx). Sábado e Domingo em azul.
    print vo al w "se te qa qi sx " a "sa do" w
}
{
    # Ignora linhas que contenham letras (como o nome do mês gerado pelo ncal)
    if ($0 ~ /[a-zA-Z]/) { next }
    if (length($0) == 0) { next }

    linha = vd al
    for (i = 0; i < 7; i++) {
        campo = substr($0, 1 + (i * 3), 2)
        dia_limpo = campo
        gsub(/[[:space:]]/, "", dia_limpo)
        
        if (dia_limpo == "") {
            txt = "  "
        } else {
            num = dia_limpo + 0
            fmt = sprintf("%2s", dia_limpo)
            
            # LÓGICA DE CORES:
            if (num == d) {
                cor = v
            } else if (i == 5 || i == 6) { 
                if (num < d) cor = ao
                else cor = a
            } else if (num < d) {
                cor = c
            } else {
                cor = w
            }
            
            txt = cor fmt w
        }
        sep = (i < 6) ? " " : ""
        linha = linha txt sep
    }
    print linha
}'

outra coisa, ficou configurado para resolucao de 1366x768 (16:9)

fora essa resolucao nao tem “galantia” :goblin: