Daemon de monitoreo de conectividad por ping persistente, administrado
completamente desde una sola CLI (snmcli.sh) — instalación, alta/baja de
monitores por host (IP o dominio), y visualización de logs, todo sin salir
del script.
| Archivo | Rol |
|---|---|
snmcli.sh |
CLI de administración (punto de entrada único, requiere sudo) |
snm.sh |
Daemon que hace el ping persistente y escribe logs |
snm@.service |
Unit de systemd (template, una instancia por host) |
snm.logrotate |
Rotación de logs |
Los cuatro archivos deben estar en el mismo directorio al ejecutar
install — snmcli.sh los copia a su ubicación final automáticamente.
- Linux con systemd (el proyecto depende de units
@.serviceysystemctl) - logrotate instalado (
apt install logrotate/dnf install logrotatesegún distro) pingdisponible (paqueteiputils-pingen Debian/Ubuntu, suele venir preinstalado)getentdisponible (parte de glibc, viene por defecto en casi cualquier distro)- Bash (el script usa sintaxis específica de bash, no es POSIX
shpuro)
sudo ./snmcli.sh installEsto:
- Crea el usuario de sistema
snm(sin login, sin privilegios extra) - Copia
snm.sha/opt/snm/snm.sh - Instala la unit de systemd en
/etc/systemd/system/snm@.service - Instala la config de logrotate en
/etc/logrotate.d/snm - Crea
/var/log/snm/con los permisos correctos - Hace
systemctl daemon-reload
Es idempotente: si ya está instalado, no rompe nada al volver a correrlo.
| Comando | Requiere sudo | Qué hace |
|---|---|---|
install |
Sí | Instalación inicial (usuario, binario, systemd, logrotate) |
add <host> |
Sí | Crea y arranca un monitor para una IP o dominio |
start <host> |
Sí | Inicia un monitor ya existente |
stop <host> |
Sí | Detiene un monitor |
restart <host> |
Sí | Reinicia un monitor |
remove <host> |
Sí | Detiene, deshabilita y opcionalmente borra logs |
list |
No* | Lista todos los monitores y su estado |
view <host> |
No* | Menú interactivo: eventos, latencia, estado |
uninstall |
Sí | Elimina SNM por completo (con confirmación) |
help |
No | Muestra la ayuda |
-i / --interactive |
Sí | Shell interactivo con todos los comandos anteriores |
* list y view solo leen datos, así que no necesitan root en teoría —
pero como todo lo demás sí lo requiere, se recomienda correr siempre con
sudo para no tener que acordarte cuál comando lo necesita y cuál no.
sudo ./snmcli.sh add 172.17.0.0
sudo ./snmcli.sh add example.comAntes de habilitar el servicio, valida que el host resuelva (getent/ping)
para evitar que systemd quede en loop de reinicio por un typo.
sudo ./snmcli.sh listHOST SYSTEMD ESTADO
----------------------------------------------------------
172.17.0.0 active UP
example.com active DOWN
- SYSTEMD: estado del servicio (
active/inactive/failed) - ESTADO: estado real del daemon según el último ping (
UP/DOWN)
sudo ./snmcli.sh view 172.17.0.0Abre un menú interactivo:
== Monitor: 172.17.0.0 ==
1) Ver eventos (tail -f, Ctrl+C para salir)
2) Ver latencia (tail -f, Ctrl+C para salir)
3) Ver estado actual
4) Ver systemctl status
5) Volver
Ctrl+C durante las opciones 1 o 2 interrumpe solo el tail -f y te regresa
a este menú — no cierra snmcli.sh ni te saca del modo interactivo (-i)
si estabas ahí.
sudo ./snmcli.sh start 172.17.0.0
sudo ./snmcli.sh stop 172.17.0.0
sudo ./snmcli.sh restart 172.17.0.0sudo ./snmcli.sh remove 172.17.0.0Detiene y deshabilita el servicio, y pregunta si además quieres borrar sus logs históricos.
sudo ./snmcli.sh uninstallDetiene y deshabilita todas las instancias, borra /opt/snm, la unit
de systemd y la config de logrotate. Pregunta por separado si también
quieres borrar los logs en /var/log/snm.
./snmcli.sh helpEn vez de escribir sudo ./snmcli.sh <comando> <host> cada vez, puedes
entrar a un shell propio y escribir los comandos línea a línea, sin el
prefijo:
sudo ./snmcli.sh -iSNM — shell interactivo
Escribe los mismos comandos sin 'sudo ./snmcli.sh' (ej: 'add 172.17.0.0', 'list').
Escribe 'help' para ver todos los comandos, 'exit' o Ctrl+D para salir.
snm> add 172.17.0.0
snm> list
snm> view 172.17.0.0
snm> exit
- Acepta los mismos comandos que el modo normal (
add,start,stop,restart,remove,list,view,uninstall,help). - Flecha arriba navega el historial de la sesión.
exit,quit,qo Ctrl+D salen del shell.- Como sigue siendo el mismo proceso con privilegios root (heredados del
sudoinicial), no vuelve a pedir contraseña entre comandos. - Un comando mal escrito o sin argumentos (ej.
addsin host) muestra el error correspondiente y te deja seguir en el shell — no te saca al prompt del sistema.
Para un host 172.17.0.0, en /var/log/snm/:
events_172.17.0.0.log— transiciones UP/DOWN con timestamp y duración de caídaslatency_172.17.0.0.log— CSVtimestamp,host,rtt_msde cada ping exitoso.status_172.17.0.0— estado actual en una línea (UP/DOWN)
Rotación: diaria, retiene 14 días, comprime, rota también al superar 20 MB.
- Cada host monitoreado corre como instancia independiente de systemd
(
snm@<host>.service), aislada de las demás. - El daemon corre como usuario
snm(no root), con la capability mínimaCAP_NET_RAWnecesaria para ICMP crudo. snmcli.shes solo el orquestador — no modifica la lógica de ping/estado, que vive ensnm.sh.
| Síntoma | Causa probable | Verificación |
|---|---|---|
snmcli.sh pide sudo aunque ya lo usaste |
No se ejecutó como root real (ej. dentro de un contenedor sin privilegios) | echo $EUID debe ser 0 |
add falla con "no se pudo resolver" |
El host no responde a getent/ping desde este servidor |
Prueba manualmente: ping -c1 <host> |
status=203/EXEC en systemctl status |
/opt/snm/snm.sh no existe o perdió el +x |
ls -la /opt/snm/snm.sh |
list no muestra un host que agregaste |
El nombre de host tiene caracteres distintos entre add y lo que buscas (mayúsculas, etc.) |
Usa exactamente el mismo string en todos los comandos |
Ctrl+C en view (opción 1/2) cierra todo snmcli.sh |
Versión desactualizada del script (bug corregido) | Verifica que tu snmcli.sh tenga trap 'true' INT cerca del inicio del archivo |
Unit file ... does not exist al hacer start/stop manualmente con systemctl |
El host no está agregado todavía | Agrégalo primero con sudo ./snmcli.sh add <host> |
Después de editar manualmente snm@.service fuera de snmcli.sh, siempre:
sudo systemctl daemon-reload
sudo ./snmcli.sh restart <host>