Skip to main content
Back to blog
· 9 min read

Raspberry Pi 4: lanzar htop automáticamente en pantalla LCD con Systemd

Guía paso a paso para crear un servicio de Systemd que lance htop automáticamente en la pantalla LCD de 3.5" conectada por GPIO en Raspberry Pi 4, convirtiendo tu RPi en un monitor de recursos dedicado.

linux raspberry-pi sre terminal

Tienes una Raspberry Pi 4 con una pantalla de 3.5” conectada por GPIO y funcionando. Ahora quieres que cada vez que enciendas la placa, htop se lance automáticamente en esa pantalla sin necesidad de conectarte por SSH ni tocar nada. El resultado: un monitor de recursos dedicado que arranca solo.

La solución es crear un servicio de Systemd que limpie la terminal física (tty1), desactive el login por defecto y lance htop directamente en la pantalla. Este artículo cubre el proceso completo: preparación del entorno, creación del servicio, activación y consideraciones para entornos de producción.

Requisito previo: este artículo asume que ya tienes la pantalla GPIO configurada y funcionando. Si aún no la has configurado, sigue primero la guía Raspberry Pi 4: configurar una pantalla genérica de 3.5” por GPIO sin romper tu sistema.

Requisitos previos

  • Raspberry Pi 4 con Raspberry Pi OS instalado (Bookworm o posterior).
  • Pantalla de 3.5” por GPIO/SPI configurada y funcionando (mostrando la consola del sistema al arrancar).
  • Acceso a la terminal (por SSH o directamente por HDMI).
  • htop instalado (se cubre en la siguiente sección).

Preparar el entorno

Antes de crear el servicio, necesitas dos cosas: asegurarte de que htop esté instalado y desactivar el proceso de login que ocupa la pantalla física.

Instalar htop

Verifica si htop está disponible en tu sistema:

which htop

Si no devuelve una ruta, instálalo:

sudo apt update && sudo apt install htop -y

Confirma la instalación verificando la versión:

htop --version

Desactivar el login en la pantalla física (tty1)

Por defecto, Systemd lanza un proceso getty en tty1 que muestra el prompt de login (raspberrypi login:). Si no lo desactivas, este proceso competirá con htop por la pantalla y verás texto superpuesto.

Detén el servicio de login en tty1:

sudo systemctl stop [email protected]

Enmascáralo para que no vuelva a iniciarse en futuros arranques:

sudo systemctl mask [email protected]

Nota: mask es más fuerte que disable. Un servicio enmascarado no puede iniciarse ni manual ni automáticamente hasta que lo desenmascares con sudo systemctl unmask [email protected]. Si necesitas un repaso sobre las acciones de systemctl, consulta la guía de systemctl.

Crear el servicio de Systemd

Un archivo de unidad .service le indica a Systemd exactamente cómo debe ejecutar un programa: con qué usuario, en qué terminal, qué hacer si falla y cuándo arrancarlo. Vamos a crear uno que lance htop y lo envíe a la pantalla LCD.

Crear el archivo de unidad

Crea el archivo del servicio en el directorio de configuración de Systemd:

sudo nano /etc/systemd/system/screen-htop.service

Contenido del archivo

Pega el siguiente contenido:

[Unit]
Description=Lanzar htop en pantalla LCD
After=multi-user.target
Conflicts[email protected]

[Service]
Type=simple
User=root
Environment=TERM=xterm-256color
ExecStartPre=/usr/bin/stty -F /dev/tty1 cols 100 rows 30
ExecStart=/usr/bin/htop
StandardInput=tty
StandardOutput=tty
TTYPath=/dev/tty1
TTYReset=yes
TTYVHangup=yes
Restart=always

[Install]
WantedBy=multi-user.target

Guarda los cambios con Ctrl + O, confirma con Enter y sal del editor con Ctrl + X.

Directivas del archivo .service

Cada directiva del archivo tiene un propósito específico. La siguiente tabla explica qué hace cada una:

SecciónDirectivaDescripción
[Unit]DescriptionNombre descriptivo del servicio. Aparece en los logs y en la salida de systemctl status.
[Unit]AfterAsegura que el servicio inicie después de que el sistema alcance el modo multiusuario (red activa, servicios básicos cargados).
[Unit]ConflictsDeclara conflicto con [email protected]. Si ambos intentan ejecutarse, Systemd detendrá el conflictivo.
[Service]Typesimple indica que el proceso principal es el comando de ExecStart y se considera iniciado inmediatamente.
[Service]UserUsuario bajo el que se ejecuta el servicio. root es necesario para acceder a /dev/tty1.
[Service]EnvironmentDefine la variable de entorno TERM=xterm-256color para que htop renderice colores correctamente.
[Service]ExecStartPreComando que se ejecuta antes de ExecStart. Aquí configura las dimensiones de la terminal (cols 100 rows 30) con stty.
[Service]ExecStartComando principal del servicio. Usa la ruta absoluta al binario de htop (/usr/bin/htop).
[Service]StandardInputRedirige la entrada estándar al dispositivo TTY (necesario para que htop reciba input del teclado, si lo conectas).
[Service]StandardOutputRedirige la salida estándar al dispositivo TTY para que htop se muestre en la pantalla.
[Service]TTYPathEspecifica el dispositivo de terminal donde se ejecuta el servicio. /dev/tty1 corresponde a la pantalla física (la LCD por GPIO).
[Service]TTYResetResetea la configuración de la terminal cuando el servicio se detiene. Limpia la pantalla.
[Service]TTYVHangupEnvía una señal de virtual hangup a la terminal al detenerse, cerrando cualquier proceso que la esté usando.
[Service]Restartalways reinicia el servicio automáticamente si se detiene por cualquier motivo (fallo, señal, etc.).
[Install]WantedByIndica que el servicio debe iniciarse en el target multi-user.target (arranque normal del sistema, sin entorno gráfico).

Importante: las directivas TTYPath, StandardInput y StandardOutput son clave. Sin ellas, htop se ejecutaría en segundo plano sin salida visible y el servicio no tendría ningún efecto en la pantalla.

Activar y probar el servicio

Una vez guardado el archivo, recarga Systemd para que reconozca la nueva unidad, habilítala para el arranque automático e iníciala:

sudo systemctl daemon-reload
sudo systemctl enable screen-htop.service
sudo systemctl start screen-htop.service
ComandoDescripción
sudo systemctl daemon-reloadObliga a Systemd a leer los archivos de unidad nuevos o modificados.
sudo systemctl enable screen-htop.serviceConfigura el servicio para que inicie automáticamente en cada arranque del sistema.
sudo systemctl start screen-htop.serviceInicia el servicio inmediatamente, sin necesidad de reiniciar.

Verifica que el servicio esté corriendo:

systemctl status screen-htop.service

Si todo está bien, deberías ver Active: active (running) en la salida y htop mostrándose en la pantalla LCD.

Ajustar las dimensiones de la pantalla

La directiva ExecStartPre ejecuta stty para configurar las dimensiones de la terminal antes de lanzar htop. Los valores cols 100 rows 30 son un buen punto de partida para una pantalla de 3.5”, pero puede que necesites ajustarlos según tu modelo específico.

PantallaValor sugeridoNotas
3.5” genérica (480x320)cols 100 rows 30Punto de partida recomendado. Texto legible pero compacto.
3.5” con mayor resolucióncols 120 rows 35Prueba si tu pantalla soporta más densidad de texto.
2.8” genérica (320x240)cols 80 rows 24Pantallas más pequeñas necesitan menos columnas y filas.

Para cambiar las dimensiones, edita el archivo del servicio:

sudo nano /etc/systemd/system/screen-htop.service

Modifica la línea ExecStartPre:

ExecStartPre=/usr/bin/stty -F /dev/tty1 cols 120 rows 35

Después de guardar, recarga y reinicia el servicio:

sudo systemctl daemon-reload
sudo systemctl restart screen-htop.service

Nota: si el texto aparece cortado o desbordado, reduce los valores. Si ves demasiado espacio vacío, auméntalos. El ajuste es iterativo.

Consideraciones para SRE y power users

Alternar entre htop y btop

Si prefieres btop (una alternativa más visual a htop), instálalo y cambia la ruta en el servicio:

sudo apt install btop -y

Edita el archivo del servicio y reemplaza la línea ExecStart:

ExecStart=/usr/bin/btop

Recarga y reinicia:

sudo systemctl daemon-reload
sudo systemctl restart screen-htop.service

Nota: btop requiere más recursos de CPU y memoria que htop. En una Raspberry Pi 4, funciona bien, pero si usas un modelo con menos RAM, htop es la opción más ligera.

Depuración con journalctl

Si el servicio no arranca o htop no se muestra en la pantalla, el primer paso es revisar los logs:

sudo journalctl -u screen-htop.service

Para ver los logs en tiempo real mientras depuras:

sudo journalctl -u screen-htop.service -f

Errores comunes y sus causas:

ErrorCausa probable
Failed to start con código 203El binario de htop no existe en la ruta especificada. Verifica con which htop.
Failed to set up TTY[email protected] sigue activo y bloquea la terminal. Enmascáralo.
htop se muestra pero sin coloresLa variable TERM no está definida o es incorrecta. Verifica que sea xterm-256color.
Texto cortado o caracteres fuera de pantallaLas dimensiones de stty no coinciden con la resolución de la pantalla.

Desactivar el servicio temporalmente

Si necesitas liberar tty1 para depurar o para otro propósito:

sudo systemctl stop screen-htop.service

Para desactivar el inicio automático sin eliminar el servicio:

sudo systemctl disable screen-htop.service

Para restaurar el login normal en la pantalla:

sudo systemctl unmask [email protected]
sudo systemctl start [email protected]

Comandos útiles

ComandoDescripción
systemctl status screen-htop.serviceVer el estado actual del servicio
sudo journalctl -u screen-htop.serviceVer los logs completos del servicio
sudo journalctl -u screen-htop.service -fVer los logs en tiempo real
sudo systemctl restart screen-htop.serviceReiniciar el servicio (útil tras cambios de configuración)
sudo systemctl daemon-reloadRecargar Systemd tras modificar el archivo .service
which htopObtener la ruta absoluta del binario de htop
sudo stty -F /dev/tty1 cols 100 rows 30Ajustar las dimensiones de la terminal manualmente
sudo systemctl unmask [email protected]Desenmascarar el login de tty1 si necesitas restaurarlo

Buenas prácticas

  • Ejecuta daemon-reload después de cada cambio en el archivo .service — sin este paso, Systemd no reconocerá las modificaciones y seguirá usando la versión anterior del servicio.
  • Usa rutas absolutas en ExecStart y ExecStartPre — el entorno de ejecución de Systemd es mínimo y no carga el PATH del usuario. Obtén la ruta con which htop o which stty.
  • Enmascara [email protected] en lugar de solo deshabilitarlomask previene que otro servicio o dependencia reactive el login en la pantalla. disable no es suficiente en este caso.
  • Configura Restart=always para mantener el monitor activo — si htop se cierra inesperadamente (por ejemplo, al presionar q accidentalmente desde un teclado conectado), Systemd lo reiniciará automáticamente.
  • Ajusta cols y rows de forma iterativa — empieza con los valores sugeridos y modifica en incrementos pequeños. Un ajuste incorrecto no daña nada, solo afecta la legibilidad.
  • Revisa los logs con journalctl antes de buscar soluciones complejas — la mayoría de problemas con servicios de Systemd se diagnostican leyendo los logs. Es siempre el primer paso.
  • Documenta los cambios en el archivo .service — agrega comentarios con # explicando qué hace cada directiva y por qué elegiste ciertos valores. Facilita el mantenimiento a futuro.
  • Prueba el servicio tras cada reinicio del sistema — un servicio que funciona con start no siempre arranca correctamente en el boot. Reinicia la Raspberry Pi al menos una vez para confirmar.