Curso de Linux / Consultar, pausar, reanudar y terminar procesos

Para gestionar procesos en Linux, identifique primero el objetivo y observe su estado y consumo de recursos. ps muestra una instantánea y top actualiza la vista. Si necesita terminar un proceso propio, solicite primero la finalización con TERM y reserve KILL para cuando la terminación normal no sea suficiente y el objetivo esté confirmado.

Este artículo es una práctica básica sobre estado de procesos, control de trabajos y señales. La reparentación después de que termina el padre, los procesos zombi y el espacio de nombres PID se pueden leer en Explicación complementaria de PID y PPID.

Diferenciar entre procesos y trabajos del shell

Un proceso es una instancia de un programa en ejecución. Su identificador de proceso (PID) lo distingue dentro del espacio de nombres de PID visible. El identificador del padre (PPID) señala su padre actual, que puede cambiar si el proceso es adoptado. Un trabajo es una unidad gestionada por el intérprete de órdenes y puede contener varios procesos; un número como %1 identifica un trabajo, no un PID.

Si bien hay procesos que ejecutan servicios, no todos los procesos son servicios. Para reiniciar un servicio gestionado por un daemon, se debe revisar primero el estado y los registros del administrador de servicios antes de matar arbitrariamente un proceso. Este curso se enfoca en que un usuario común pueda verificar y controlar sus propios procesos de práctica.

Seleccionar solo las columnas necesarias con ps

ps muestra la lista de procesos en el momento en que se ejecuta el comando. Cuando se observa todo el sistema, si se especifican las columnas deseadas, se pueden comparar de un vistazo el PID, el proceso padre, el usuario, el estado, el tiempo de ejecución y el comando. La salida puede ser larga, por lo que si hay un objetivo específico, limite el rango usando el PID o el nombre del comando.

ps -eo pid,ppid,user,stat,etime,args
ps -eo pid,ppid,user,%cpu,%mem,stat,args --sort=-%cpu | head

El segundo ejemplo es la primera parte ordenada de manera descendente según %CPU. Los valores de CPU se ven afectados por la forma de medición y visualización, por lo que no se debe determinar la causa de un fallo solo con una pantalla momentánea. La primera letra de STAT representa el estado principal. R indica que está en ejecución o en espera de ejecución, S está en espera interrumpible, D generalmente en espera no interrumpible, T detenido, y Z es un estado zombi, donde el hijo ha terminado pero el padre aún no lo ha recogido. Las letras adicionales pueden indicar características extra.

Ver cambios con top y pgrep

top actualiza periódicamente la lista de procesos y el estado de uso de recursos. El criterio de orden y los valores mostrados en la pantalla dependen del entorno, y para salir se presiona q. Es útil cuando se desea observar la evolución de los cambios en lugar de ejecutar repetidamente ps.

top

Puede usar pgrep para encontrar el PID por nombre de comando. -a muestra el PID junto con la línea de comando. Puede haber varios procesos con nombres similares, y el objetivo puede terminarse inmediatamente después de la consulta o el PID puede reutilizarse, así que no confíe únicamente en el número encontrado para terminarlo de inmediato.

pgrep -a sleep

Si no hay resultados de la consulta, puede ser que no exista un proceso con ese nombre, que la información esté restringida para el usuario actual, o que los criterios de búsqueda no coincidan. Al observar asignando su propio proceso, es más claro usar el PID registrado por la shell, como en la práctica siguiente.

Pausar y reanudar mi proceso

El siguiente ejemplo se ejecuta en Bash. sleep 300 & inicia un proceso en segundo plano que espera 300 segundos, y $! es el PID del trabajo en segundo plano recién iniciado. No realice esta práctica de señales en procesos de otros usuarios o servicios en ejecución. Si cierra la shell antes de que finalice el ejemplo, puede perder el PID de la práctica, así que continúe hasta el final en la misma shell.

sleep 300 &
practice_pid=$!
printf 'practice PID: %s\n' "$practice_pid"
ps -p "$practice_pid" -o pid,ppid,stat,etime,args
kill -STOP "$practice_pid"
ps -p "$practice_pid" -o pid,stat,args
kill -CONT "$practice_pid"
ps -p "$practice_pid" -o pid,stat,args

Si en el primer ps ve el sleep correspondiente, el objetivo es correcto. Después de STOP, generalmente la primera letra del estado se muestra como T, y después de CONT vuelve al estado de espera como S, etc. El estado real varía según el momento de la observación. STOP no es un cierre, sino una suspensión de ejecución, y CONT reanuda la ejecución de un proceso suspendido.

Solicitar la finalización con TERM y verificar el resultado

Al finalizar la práctica, ejecute el siguiente comando en la misma shell. TERM es la señal de terminación predeterminada que da al proceso la oportunidad de realizar tareas de limpieza. wait espera hasta que los procesos hijos terminen y recoge su estado de terminación. Dado que ha finalizado por señal, el estado de terminación de wait puede no ser 0.

kill -TERM "$practice_pid"
wait "$practice_pid"
ps -p "$practice_pid" -o pid,stat,args

Cuando al usar el último ps solo aparece el encabezado o indica que no hay destino, generalmente significa que el proceso de la práctica con ese PID ha desaparecido. Sin embargo, los PID pueden reutilizarse, así que no suponga que es el mismo proceso si ve el mismo PID más tarde. Si el programa ignora TERM o está realizando la limpieza, espere un momento y verifique el estado y los registros.

kill -KILL PID no da al proceso la oportunidad de manejar la señal o de realizar limpieza por sí mismo. Cuando se usa en programas que están escribiendo datos, bases de datos o servicios, el estado puede volverse inconsistente, así que solo considérelo si la causa y el objetivo son claros y la terminación normal falla. Los procesos sin permisos no pueden recibir señales de un usuario normal. Los estados D que no finalizan pueden no resolverse inmediatamente solo con señales forzadas.

Primer plano y segundo plano del intérprete de órdenes

En Bash, COMANDO & inicia un trabajo en segundo plano. jobs -l muestra los trabajos y PID que conoce el intérprete de órdenes actual; no enumera los de otras terminales ni todos los procesos del sistema. Después de suspender un trabajo en primer plano con Ctrl+Z, puede reanudarlo con bg %1 o traerlo al primer plano con fg %1. Sustituya el número por el que muestre jobs.

jobs -l

Simplemente poner un proceso en segundo plano desde la terminal no lo convierte en un servicio que funcione de manera confiable después de cerrar sesión. Está sujeto a la sesión, entrada/salida y señales. Para los procesos de servidor que deben gestionarse continuamente, es más apropiado utilizar el método de gestión de servicios de la distribución correspondiente.

Orden de juicio cuando un proceso tiene problemas

  1. Identifique PID, comando, propietario y proceso padre con ps o pgrep; el nombre por sí solo no identifica de forma fiable el objetivo.
  2. Observe con top y los registros si el consumo de CPU y memoria persiste, si el proceso espera o si hay errores.
  3. Compruebe si pertenece a un servicio y revise sus herramientas de administración y registros.
  4. Si necesita terminar un proceso propio, solicítelo con TERM y deje tiempo para la limpieza. Evalúe otra medida solo si hace falta.
  5. Compruebe el resultado con ps e investigue reinicios automáticos o reapariciones.

Documentación oficial

El manual de ps(1) describe los campos de salida y códigos de estado, el manual de pgrep(1) los criterios de búsqueda, y el manual de kill(1) describe la transmisión de señales. Para la diferencia entre el número de trabajo del shell y fg·bg, consulte la documentación de control de trabajos de GNU Bash.