Teste protocol pgsql gera erros de autenticação no PostgreSQL
Nas 5.x, sem credenciais o teste usa utilizador/base pré-definidos; nas 5.x também há um problema na interpretação de respostas malformadas (corrigido na 6.0.0)
Usar teste TCP sem protocol (com credenciais desde a 5.29.0, se precisares do handshake) — ver secção 9
monit -t passa mas algo falha em execução
O teste valida sintaxe, não operação — pidfiles, caminhos, endpoints e credenciais só se provam em execução
Teste controlado de falha/recuperação + alerta real numa caixa que a equipa leia (checklist)
style=”font-family:Arial,sans-serif;font-size:26px;font-weight:700;color:#1a202c;line-height:1.3;margin:0 0 18px 0;”>Monit: Monitorização e Reparação Automática de Serviços Linux
Neste artigo:
- Instalar o Monit
- O monitrc base: ciclo, log e alertas globais
- Vigiar um serviço local: check process
- Serviços remotos: HTTPS, conteúdo e ping
- Recursos do sistema: carga, memória e discos
- Ficheiros, checksums e scripts
- A interface web e a linha de comandos
- Alertas por email: relay, formato e fila
- Dependências, grupos e modo passivo
- Erros Comuns
- Checklist
- Artigos Relacionados
- Fontes Oficiais
Há duas formas de lidar com um serviço que morre: avisar alguém, ou reparar sozinho. As plataformas de monitorização centralizadas fazem bem a primeira — gráficos, histórico, alertas por email — mas um aviso às 03:12 só se lê às 09:00, e entretanto a aplicação esteve em baixo quase seis horas. Falta a peça que repara sem esperar por ninguém.
Essa peça é o Monit. É um agente open source que corre no próprio servidor Linux (também macOS, BSD e Solaris), vigia processos, ficheiros, portas e recursos num ciclo de 30 a 60 segundos e, quando algo falha, executa a acção configurada — reiniciar o serviço, correr um script, disparar um alerta — antes de acordar alguém. A configuração vive num único ficheiro com sintaxe própria, a interface web vem incluída e a instalação cabe num apt install.
Este guia parte de um Debian 12 ou 13 (ou Ubuntu LTS) e monta tudo: instalação, configuração base, vigilância de serviços e recursos, testes remotos de portas e HTTPS, alertas por email, interface web e dependências entre serviços. Os exemplos seguem o manual oficial do Monit e as configurações de exemplo dos autores. Nos repositórios, o Debian 12 traz a 5.33.0 e o Debian 13 a 5.34.3 (packages.debian.org, bookworm) — a versão actual a montante é a 6.0.0, de Junho de 2026 (novidades).
1. Instalar o Monit
O pacote traz o binário, o ficheiro de configuração e o serviço systemd:
sudo apt update
sudo apt install monit
monit -V
O monit -V imprime a versão instalada. Nos sistemas Debian o serviço corre a partir de /lib/systemd/system/monit.service e a configuração principal fica em /etc/monit/monitrc — é este o caminho nas distribuições Debian-like, e não o ~/.monitrc genérico que o manual lista como por omissão (ver tutorial de referência).
Antes de qualquer edição, uma regra que vale para todo o artigo: o Monit só lê o ficheiro de configuração depois de validar a sintaxe, e recusa-se a arrancar com erros. O monit -t é o gate de todas as alterações:
sudo monit -t
Control file syntax OK
Se houver erro, o Monit imprime a mensagem e o número da linha no monitrc. E atenção às permissões: o ficheiro tem de ficar com permissões iguais ou mais restritas que 0700 — o Monit queixa-se e sai caso contrário, porque o monitrc pode conter passwords:
sudo chmod 600 /etc/monit/monitrc
2. O monitrc base: ciclo, log e alertas globais
O monitrc do pacote vem quase todo comentado e serve de documentação. As linhas que sustentam o resto do artigo:
set daemon 60
with start delay 30
set log /var/log/monit.log
set alert root@localhost
but not on { instance, action }
set mail-format {
from: monit@$HOST
subject: [$SERVICE] $EVENT at $DATE
message: $DESCRIPTION
Servidor: $HOST
Acção: $ACTION
Data: $DATE
}
include /etc/monit.d/*.cfg
Linha a linha:
set daemon 60— o intervalo do ciclo de vigilância (sintaxeSET DAEMON <seconds>). Sem esta linha, o Monit corre os testes uma vez e sai — o modo daemon é o modo por omissão só quando esta linha existe.with start delay 30— espera 30 segundos depois do reboot antes do primeiro ciclo, para não reiniciar serviços que o arranque ainda está a levantar. Por omissão o Monit começa a verificar imediatamente.set log— registo em ficheiro próprio, comsyslogcomo alternativa (a forma antigaset logfileestá deprecada).set alert— o destinatário global de todos os eventos. O filtrobut not on { instance, action }silencia os eventos internos do próprio Monit (arranques, recargas), que de outra forma inundam a caixa de entrada.set mail-format— o formato do email. O Monit expande as variáveis$SERVICE,$EVENT,$DATE,$HOST,$ACTIONe$DESCRIPTIONem cada alerta.include— cada serviço pode viver num ficheiro separado (aceita globs, até 1024 ficheiros incluídos).
Depois de cada alteração ao monitrc: sudo monit -t e, sem erros, sudo systemctl restart monit — ou sudo monit reload para recarregar sem reiniciar o serviço.
3. Vigiar um serviço local: check process
A unidade básica do monitrc é o check. Este bloco vigia o nginx, reinicia-o se a porta 80 deixar de responder e desarma a vigilância se entrar em loop:
check process nginx with pidfile /run/nginx.pid
start program = "/usr/bin/systemctl start nginx"
stop program = "/usr/bin/systemctl stop nginx"
if failed port 80 protocol http for 2 cycles then restart
if 3 restarts within 5 cycles then unmonitor
- A pidfile tem de ser a que o serviço realmente escreve — no nginx de Debian é a directiva
pid /run/nginx.pidnonginx.conf. Quando o serviço não cria pidfile (osshddo systemd, por exemplo, corre sem daemonizar), usa-se a formamatching, que procura o processo por padrão:check process sshd matching "/usr/sbin/sshd". O Monit confirma sempre que o PID no ficheiro pertence a um processo vivo — um PID deixado por um crash não engana o teste, que também detecta processos zombie (FAQ oficial). start/stoprecebem o caminho absoluto de um executável. O Monit usa a chamadaexecve não é uma shell: pipes e&&não funcionam directamente — para composições, embrulhar em/bin/bash -c 'comando && comando'.for 2 cyclesexige duas falhas consecutivas antes da acção. Sem ele, uma falha isolada de um ciclo dispara o restart à toa.- A guarda
if 3 restarts within 5 cycles then unmonitoré o travão do loop infinito: se o serviço cair, for reiniciado e voltar a cair três vezes em cinco ciclos, o Monit desarma a vigilância em vez de reiniciar para sempre. Nota: desarmar também significa deixar de tentar reparar — o serviço fica sem reparação automática até alguém assumir o alerta, corrigir e reactivar comsudo monit monitor nginx. Para voltar a vigiar:sudo monit monitor nginx.
Um teste extra com valor de segurança — avisar quando o PID muda entre dois ciclos, sinal de que alguém reiniciou o serviço fora do controlo do Monit (o exemplo do manual usa-o no sshd):
check process sshd matching "/usr/sbin/sshd"
if changed pid then alert
4. Serviços remotos: HTTPS, conteúdo e ping
Para vigiar serviços que não vivem no mesmo servidor usa-se check host. O exemplo valida o certificado TLS de um site e responde ao ping:
check host web-publico with address www.exemplo.pt
if failed
port 443
protocol https
with ssl options {verify: enable}
then alert
if failed ping with timeout 10 seconds then alert
check hosttesta serviços remotos — não existe pidfile nem start/stop, só testes de rede e a acção (tipicamentealert).with ssl options {verify: enable}liga a validação do certificado TLS — por omissão o Monit não exige certificados válidos (exemplo do manual).- O ping envia ICMP e tolera perda de pacotes até certo limite. Nota do manual para redes reais: muitos operadores filtram ICMP, e nesse caso o teste falha sempre — o aviso de indisponibilidade seria um falso permanente.
Também se pode exigir conteúdo na resposta, não só a porta aberta:
check host api with address api.exemplo.pt
if failed
port 443
protocol https with ssl options {verify: enable}
request "/health"
with content = "OK"
for 2 cycles
then alert
requestpede um documento específico (por omissão é/) ewith contentexige um padrão no corpo da resposta — a API pode estar de pé e a devolver erros na mesma. No bloco da API, owith content = "OK"procura um padrão no corpo da resposta — não valida a resposta da aplicação como um todo: um endpoint de saúde deve devolver conteúdo inequívoco (evitar páginas de manutenção que devolvem 200 com HTML genérico). Owith ssl options {verify: enable}repete a validação do certificado neste teste — quem copiar só este bloco obtém a mesma garantia do bloco anterior.- O Monit trata respostas com status HTTP de 400 ou superior como falha. Para o caso inverso — uma página que deve devolver 404 — o manual mostra o
status = 404a inverter o teste.
5. Recursos do sistema: carga, memória e discos
O check system vigia o servidor como um todo e o check filesystem os pontos de montagem:
check system $HOST
if loadavg (1min) per core > 2 for 5 cycles then alert
if loadavg (5min) per core > 1.5 for 10 cycles then alert
if cpu usage > 95% for 5 cycles then alert
if memory usage > 90% then alert
if swap usage > 25% then alert
check filesystem rootfs with path /
if space usage > 85% then alert
if inode usage > 85% then alert
$HOSTexpande para o nome da máquina — é o nome que aparece nos alertas e na interface web. Sem DNS, escrever directamente uma string descritiva.per corenormaliza o load average pelo número de cores do CPU — sem ele, os limiares teriam de acompanhar o hardware de cada servidor.- O
check filesystemmede espaço e inodes: sistemas com milhões de ficheiros pequenos podem esgotar inodes com disco livre, e o teste de espaço não apanha o caso. - O valor máximo de ciclos por teste é 64 — limiares que exijam janelas maiores têm de usar outra estratégia (por exemplo, um
check programcom lógica própria).
Duas notas das release notes da 6.0.0: a memória por processo passa a reportar-se em PSS (memória partilhada dividida pelos processos que a usam) em vez de RSS — o limiar if memory usage > 90% do check system continua a medir a memória do sistema como antes, não passa a medir PSS — os valores baixam em relação a versões anteriores, mas reflectem melhor a contribuição real de cada processo. E há testes novos de actividade de swap (pagein/pageout), com a regra prática dos autores: até 10 páginas por segundo é paginação menor, acima de 100 sustentadas é pressão de memória, acima de 1000 é thrashing — por exemplo if pageout > 50 per second for 20 cycles then alert num check system. Estes dois testes são da 6.0.0: nos pacotes do Debian 12/13 (5.33.0/5.34.3) a sintaxe pagein/pageout não existe — é preciso compilar a versão a montante ou escolher outro teste.
6. Ficheiros, checksums e scripts
O mesmo agente serve de watchdog de segurança: vigiar que binários e configurações não mudam.
check file sshd_config with path /etc/ssh/sshd_config
if failed sha1 checksum then alert
if failed permission 644 then unmonitor
if failed uid root then unmonitor
checksumfalhado significa que o conteúdo mudou — alguém editou ou substituiu o ficheiro. Desde a 6.0.0 o hash por omissão é SHA256 (antes MD5), commd5,sha1ousha256à escolha.permission,uidegidapanham alterações de permissões e de dono — o padrão dos exemplos dos autores éunmonitornestes testes, para o Monit deixar de vigiar um ficheiro que foi adulterado. Consequência que interessa: depois de desarmado, o Monit deixa de verificar esse ficheiro — alterações posteriores já não disparam este teste até alguém investigar o alerta e reactivar comsudo monit monitor sshd_config.- O padrão de segurança do manual para binários é mais duro:
if failed checksum then unmonitornum executável faz o Monit deixar de o vigiar — e, comdepends on(secção 9), os serviços que dele dependem param também — em vez de arriscar executar um binário substituído.
Para logs que devem ter actividade, o teste de timestamp:
check file syslog with path /var/log/syslog
if timestamp is older than 1 hour then alert
E o check program corre um script e avalia o código de saída — é a porta para qualquer lógica própria:
check program verifica_backup with path /usr/local/bin/verifica-backup.sh
every "30 6 * * *"
if status != 0 then alert
status != 0dispara quando o script sai com erro — o exit code é todo o contrato.- O timeout por omissão é 300 segundos: um script que demore mais é morto e gera um evento de timeout. Muda-se com
with timeout N seconds. - O
everyaceita expressão cron já nas versões 5.x; a 6.0.0 melhorou a precisão ao minuto e a garantia de execução única por ocorrência (antes, quando o ciclo de polling se desalinhava, o teste podia ser saltado) — em 5.x a mesma expressão funciona, mas sem essa garantia. A forma simplesevery 5 cyclescontinua válida para espaçar testes. - Um clássico do género: a saúde SMART dos discos, com o pacote
smartmontoolsinstalado —check program disco_sda with path "/usr/sbin/smartctl -H /dev/sda"eif status != 0 then alert(osmartctlsai com código não-zero quando o disco falha o teste de saúde).
7. A interface web e a linha de comandos
A interface web está incluída e ativa-se com um bloco:
set httpd port 2812
use address 127.0.0.1
allow admin:"PalavraPasse"
use address 127.0.0.1liga a interface apenas ao loopback — sem esta linha, o Monit fica acessível em todas as interfaces do servidor. Para acesso remoto por rede, osallowaceitam também redes inteiras (allow 192.168.1.0/255.255.255.0) e o bloco SSL compemfilepara HTTPS.- Os mesmos
allowcriam utilizadores read-only (allow operador:senha read-only) — vêem tudo mas não têm botões de start/stop — e grupos PAM (allow @admins). - Quem preferir não abrir porta nenhuma usa socket Unix:
set httpd unixsocket /var/run/monit.sockcomallow utilizador:senha.
Do exterior, um túnel SSH chega para o loopback:
ssh -L 2812:127.0.0.1:2812 admin@servidor
Depois é abrir http://localhost:2812 no browser: estado de cada serviço, histórico de eventos e os botões de start/stop/restart.
A web é também a base da linha de comandos — monit status, monit summary, monit restart nginx, monit unmonitor nginx falam com o daemon na porta TCP 127.0.0.1:2812 por omissão (ou no socket). Sem HTTP activo, a maioria destes comandos fica sem funcionalidade — os autores recomendam expressamente manter o HTTP activo e ligado ao localhost quando a segurança preocupa.
8. Alertas por email: relay, formato e fila
Os alertas do monitrc da secção 2 precisam de um relay SMTP:
set mailserver smtp.exemplo.pt
port 587
username "[email protected]"
password "PalavraPasse"
using SSL with options {verify: enable}
- A porta 587 por si só não garante transporte protegido: o
using SSLé o que obriga à negociação TLS e ovalida o certificado do servidor — a verificação vem desactivada por omissão nas opções SSL do Monit. Confirma as opções com o teu relay (STARTTLS na 587 ou SMTPS na 465) e testa a entrega real para uma caixa que a equipa leia — oroot@localhostda secção 2 serve no servidor local, mas com um relay externo não se pode presumir que seja aceite ou entregue. Vários servidores separados por vírgula fazem failover — o Monit tenta o primeiro e passa ao seguinte se estiver em baixo (set mailserver smtp.exemplo.pt, smtp2.exemplo.pt). - O timeout por omissão da ligação SMTP é 30 segundos.
Os filtros controlam o que chega a cada destinatário:
set alert [email protected] only on { nonexist, timeout, resource, connection }
set alert root@localhost but not on { instance, action }
- A lista de tipos de evento inclui
nonexist,timeout,resource,connection,checksum,permission,uid,gid,pid,content,exec,timestampe outros —only onenvia só os listados,but not ontodos menos os listados. with reminder on 10 cyclesacrescenta um reaviso de 10 em 10 ciclos enquanto o problema durar. Por omissão o Monit avisa quando entra em falha e quando recupera — nada entretanto.- Um
noalert destinatariodentro de um serviço silencia esse destinatário para esse serviço — útil para o serviço ruidoso que enche a caixa da equipa.
Se o servidor de mail estiver em baixo quando um alerta dispara, o Monit descarta a mensagem — a fila de eventos guarda-a em disco e reenvia quando o relay volta (por omissão está desactivada):
set eventqueue basedir /var/monit slots 5000
Nota prática das release notes: desde a 5.35.0 os alertas levam os headers X-Auto-Response-Suppress: All e Precedence: Bulk, e os auto-responders do Exchange, Outlook e Gmail deixaram de responder aos alertas do Monit.
9. Dependências, grupos e modo passivo
Serviços não vivem sozinhos: o nginx serve uma aplicação que fala com a base de dados. O depends on ensina essa cadeia ao Monit:
check process postgresql with pidfile /var/run/postgresql/12-main.pid
start program = "/usr/bin/systemctl start postgresql"
stop program = "/usr/bin/systemctl stop postgresql"
group base-dados
if failed host 127.0.0.1 port 5432 then restart
check process nginx with pidfile /run/nginx.pid
start program = "/usr/bin/systemctl start nginx"
stop program = "/usr/bin/systemctl stop nginx"
group web
depends on postgresql
if failed port 80 protocol http for 2 cycles then restart
- Se o Monit parar ou desarmar o PostgreSQL, para também o nginx — a dependência propaga-se nos dois sentidos (o exemplo do manual usa a cadeia WEB-SERVER → APPLICATION-SERVER → DATABASE → FILESYSTEM e arranca pela ponta mais baixa da cadeia). Pensa antes de copiar: se o nginx serve páginas estáticas ou outras aplicações independentes da base de dados, esta dependência vai parar o web server por causa de um problema na base de dados — é uma decisão de arquitectura, para validar num ambiente de teste antes de activar em produção.
- O teste confirma a ligação TCP à porta 5432 — não a saúde funcional da base de dados: não valida autenticação, base de dados nem consultas. Para um teste com handshake, o manual documenta
protocol pgsqlcomusername/password/database— mas nas versões 5.x tem um problema conhecido na interpretação de respostas malformadas (corrigido nas notas da 6.0.0), e sem credenciais usa utilizador/base pré-definidos que geram erros de autenticação nos logs do PostgreSQL (credenciais suportadas desde a 5.29.0). A pidfile também varia:/var/run/postgresql/12-main.pidé a disposição do Debian para um cluster 12/main — confirma o caminho no servidor em causa (no PostgreSQL 17, é/var/lib/postgresql/17/main/postmaster.pid). groupjunta serviços para actuar em conjunto:sudo monit -g web restart,sudo monit -g base-dados status.mode passivenum serviço faz o Monit vigiar e avisar mas nunca reiniciar — indicado para serviços que outra ferramenta (um cluster, um orquestrador de contentores) já gere.
Erros Comuns
| Sintoma | Causa provável | Correcção |
|---|---|---|
monit status falha com erro de ligação |
HTTP do Monit inactivo ou socket diferente do que o CLI espera | Activar set httpd (TCP em 127.0.0.1 ou unixsocket) e recarregar |
| Monit recusa-se a arrancar e queixa-se das permissões | monitrc com permissões acima de 0700 | sudo chmod 600 /etc/monit/monitrc |
does not exist num processo que está a correr |
Pidfile apontada ao caminho errado ou serviço sem daemonizar | Confirmar o caminho real do pid no serviço ou usar check process X matching "padrão" |
start/stop/exec falham com exit status -1 |
Hardening systemd do pacote Debian a bloquear scripts | Inspecionar /lib/systemd/system/monit.service (FAQ oficial dos autores) |
| Serviço entra em loop de reinícios | Falta de guarda de restarts | if N restarts within M cycles then unmonitor e reactivar com monit monitor X |
Pipes ou && no start/stop/exec não funcionam |
O Monit usa execv e não é shell |
Embrulhar em /bin/bash -c 'comando && comando' |
| Alertas não chegam quando o relay esteve em baixo | Fila de eventos desactivada | set eventqueue basedir /var/monit slots 5000 |
| Alterações ao monitrc sem efeito | A configuração só se lê no arranque | sudo monit -t && sudo monit reload (ou restart do serviço) |
Checklist
- [ ]
monit -tdevolveControl file syntax OKantes de cada reload - [ ] monitrc com permissões 600
- [ ]
set daemoncom intervalo de 30 a 60 segundos ewith start delaypara os reboots - [ ] Pelo menos um
check processpor serviço crítico, comstart/stopapontados asystemctl - [ ] Guarda
if N restarts within M cycles then unmonitorem todos os serviços que o Monit reinicia - [ ]
monit -V— confirmar a versão antes de usar exemplos da 6.0.0 (pagein/pageoute as garantias doeverynão existem nas 5.33.0/5.34.3 do Debian) - [ ] Teste controlado: parar um serviço não crítico, confirmar que o Monit reinicia e que o alerta chega a uma caixa que a equipa lê
- [ ] Teste de entrega do relay: um alerta real chega ao destinatário (o
monit -tnão testa a entrega) - [ ]
monit -tvalida a sintaxe, não o funcionamento: pidfiles, caminhos systemctl, endpoints, credenciais e dependências só se provam em execução - [ ]
check systemcom load, CPU, memória e swap, echeck filesystemcom espaço e inodes em cada ponto de montagem - [ ]
set httpdlimitado a 127.0.0.1 (ou socket Unix) com utilizador e password - [ ]
set mailservercom credenciais,set alertcom filtrobut not on { instance, action }eset eventqueue - [ ]
everyem expressão cron para os testes que só correm a horas certas - [ ]
monit statusverde para todos os serviços no primeiro ciclo após o arranque
Artigos Relacionados
- Zabbix: Monitorização Open-Source para PMEs em 2026 — a monitorização centralizada que complementa o Monit: o Monit repara localmente, o Zabbix observa o parque inteiro e guarda o histórico.
- Grafana para PME 2026: Dashboards de Monitorização com Prometheus — a camada de visualização para quem precisa de gráficos e tendências que o Monit não guarda.
- journalctl: Diagnóstico de Serviços Linux do journal ao Root Cause — o que fazer quando o Monit reinicia um serviço e é preciso perceber porquê.
- Wazuh SIEM: Detecção de Ameaças e Compliance NIS2 para PME — a camada de segurança que se liga ao mesmo servidor e analisa os eventos que o Monit apenas vigia.
- OpenVAS/Greenbone: Scan de Vulnerabilidades Self-Hosted — as duas ferramentas são complementares: o Monit vigia o presente, o scanner identifica as falhas que o presente pode explorar.
Fontes Oficiais
- Monit Manual — a referência completa da sintaxe: checks, testes, acções, mail-format, httpd, dependências e a tabela de tipos de evento.
- Monit Updates and Release Notes — novidades por versão, com os detalhes da 6.0.0 (every com cron, PSS em Linux, SHA256) e da 5.35.x.
- Configuration Examples (wiki oficial) — dezenas de exemplos reais por serviço: sshd, nginx, PostgreSQL, MySQL, postfix, RAID, temperaturas.
- Monit FAQ (wiki oficial) — comportamento das pidfiles, processos zombie, debug com
monit -Ive o hardening systemd do pacote Debian. - Pacote monit em Debian — versões por distribuição: 5.33.0 no bookworm, 5.34.3 no trixie.
- Tutorial Hetzner: Light weight monitoring with Monit — instalação em Debian/Ubuntu com os caminhos de ficheiros concretos e o fluxo
monit reload.