Gestión básica de procesos en Linux

  En una entrada anterior se ha explicado qué es un proceso y su funcionamiento básico. Aunque dicha explicación estaba orientada a sistemas operativos Windows, muchos de los conceptos y comportamientos de los procesos allí dados se dan también en los procesos de Linux.
  Sin embargo, existen ciertas diferencias, inherentes al sistema operativo al que los procesos van dirigidos, entre  ambos tipos de procesos. La más importante es que, en Linux, los procesos se dividen en procesos padre y procesos hijo; mientras que los primeros son los programas en ejecución, los segundos son generados por los anteriores (si un proceso hijo se queda sin un proceso padre, es "adoptado" por el proceso inicial del sistema operativo, que tiene PID 1).
  Dado que los sistemas operativos Linux son multitarea y multiusuario, sus múltiples procesos pueden operar simultáneamente sin interferirse unos con otros. Cada proceso "está convencido" de que es el único proceso y que tiene acceso exclusivo a todos los servicios del sistema operativo. Y como los programas y los procesos son entidades distintas en esta clase de sistemas operativos, pueden ejecutarse simultáneamente múltiples instancias de un programa. Cada instancia es un proceso separado (un mismo programa ejecutado por varios usuarios diferentes en equipos diferentes al mismo tiempo, hará que se cree el mismo número de procesos que las veces que se ha ejecutado dicho programa, por ejemplo).

   Al igual que sucedía en los procesos de Windows, los de Linux también poseen un PID para identificarse y mejorar su gestión. Mas, adicionalmente, los procesos hijo tienen también un PPID, que es un número correspondiente a su proceso padre.
  En Linux, los procesos comienzan a ejecutarse desde el encendido del dispositivo informático en el siguiente orden:
  •   Se enciende el sistema y un circuito especial que hace que la CPU ejecute el código almacenado en el BIOS.
  •   El código del BIOS realiza algunas tareas, entre las que se incluyen la comprobación del hardware, su configuración y buscar un sector de arranque, que es el que contiene el cargador de arranque (LILO, GRUB o GRUB2).
  •  El objetivo final del cargador de arranque es encontrar un núcleo del sistema (llamado normalmente "Kernel"), cargarlo en la memoria y ejecutarlo.
  •   Cuando el Kernel de Linux toma el control, realiza tareas como inicializar dispositivos, montar la partición raíz y, por último, cargar y ejecutar el programa inicial de su sistema, que predeterminadamente es "/sbin/init" (aunque también existen Upstart y Systemd).
  •   El programa inicial recibe el identificador del proceso "PID 1", puesto que es el primer programa a ejecutar en el sistema. Este programa es un demonio (también conocido como proceso en segundo plano o "servicio") que continua su ejecución hasta que el sistema se apaga. Es el padre de todos los procesos (de forma directa o indirecta) y es quien adopta automáticamente los procesos huérfanos.
  Para gestionar los procesos en Linux (para lo cual suele ser buena idea ser el administrador del sistema) se suele emplear la terminal o un gestor de tareas si el sistema operativo tiene entorno gráfico.

IDENTIFICACIÓN DE PROCESOS DESDE TERMINAL

    Existen varios comandos para conocer los procesos desde una terminal:
  •   ps: Se basa en el sistema de archivos "/proc" e informa sobre el estado de los procesos. Tiene una gran cantidad de opciones [parámetros típicos: "–a", "-u" y "–x" (con o sin guión delante) muestra los procesos que se ejecutan en un momento dado en el equipo, incluyendo los de otros usuarios; " | grep [nombre del proceso]", muestra la información del proceso dado; "-e" (muestra todos los procesos que corren en el sistema) y "-f" (expande la salida para mostrar las columnas más básicas); "-l" muestra la salida en formato largo; "-H", organiza los procesos en formato jerárquico, mostrando el orden en el que los procesos se iniciaron (la columna "CMD" muestra el anidamiento de procesos); "-el", muestra el estado con una columna donde se ve el estado del proceso (S: dumiendo, R: activo, D: pausado, T: suspendido, Z: zombi)], aunque por defecto sólo muestra los procesos ejecutados por el usuario que lo llama y en el propio terminal. Puede devolver mucha información sobre todos los programas que corren en el sistema. Las columnas más básicas que se muestran suelen ser: "PID", "TTY" (terminal desde donde fue ejecutado), "TIME" (tiempo de CPU que empleó dicho proceso), y "CMD" (intérprete de comandos implicado en el proceso).







  •   pgrep:  Toma una expresión regular en línea de comandos y devuelve el ID de los procesos con nombre compatible con esa expresión regular. Deriva de los comandos ps y grep.

  •   pstree: Muestra una vista en forma de árbol (en forma jerárquica) de los procesos en ejecución. Se puede utilizar el parámetro "-p" para ver los PID de los procesos, y "-nps" para ver los procesos por orden.


  •   jobs: Lista procesos que se están ejecutando en segundo plano o en primer plano. Si no devuelve ningún tipo de respuesta es que no hay procesos presentes. Su parámetro "-l" muestra los trabajos que se están ejecutando en primer o segundo plano; su parámetro "-p" muestra únicamente el PID para los trabajos en ejecución.
  •   top: Monitoriza el sistema en tiempo real, se ejecuta desde línea de comandos, es interactivo y, por defecto, se actualiza cada 3 segundos. Estando dentro de la aplicación y pulsando la letra "h" muestra una ayuda de los posibles comandos que permiten configurar este comando.


MATAR PROCESOS DESDE TERMINAL

  Se emplea el comando kill [parámetros][PID] para finalizar o pausar un proceso cuyo PID se conoce (o se averigua identificándolo), o bien kill [parámetros] $(pgrep [nombre del proceso]) en caso contrario. Dichos comandos pueden utilizarse, como sucede la mayoría de las veces, por sí solos o empleando parámetros.
  Entre los parámetros más relevantes de este comando se encuentran: "-9", que fuerza la finalización del proceso; "-STOP", que pausa el proceso; "-CONT", que reanuda un proceso previamente pausado; "-TERM", detiene un proceso y todos sus hijos (se usa con "[PPID]" en lugar de "[PID]").
  Otras opciones derivadas son:
  •     pkill: Permite detener un proceso indicando sólo algunos caracteres de su nombre. Es un comando fácil de utilizar y que no requiere conocer el PID del proceso. Sin embargo, hay un riesgo, y es que la señal se enviará a todos los procesos que tengan una correspondencia en nombre. Cuantos más caracteres se introduzcan, más ajustada será la búsqueda.
  •   killall [CMD]: Finaliza todos los procesos que abre un comando. Se debe utilizar el nombre del proceso en lugar del PID. Este nombre viene dado en el listado de procesos como "CMD". Por otra parte, debe utilizarse como administrador (anteponiendo sudo al comando).
  •   xkill [parámetros] [PID]:  Fuerza el servidor X a cerrar las conexiones. Se puede emplear sin necesidad de indicar el PID. Por otra parte, debe utilizarse como administrador (anteponiendo sudo al comando).
  Por otra parte, en sistemas operativos Unix, un proceso zombi, o difunto  ("defunct", en inglés), es un proceso que ha completado su ejecución pero aún tiene una entrada en la tabla de procesos, permitiendo al proceso que lo ha creado leer el estado de su salida.

  Cuando un proceso acaba, toda su memoria y recursos asociados a él se desreferencian, para que puedan ser usados por otros procesos. De todas formas, la entrada del proceso en la tabla de procesos aún permanece. Al padre se le envía una señal "SIGCHLD" indicando que el proceso ha muerto; el manejador para esta señal será típicamente ejecutar la llamada al sistema wait, que lee el estado de salida y borra al zombi. El ID del proceso zombi y la entrada en la tabla de procesos pueden volver a usarse.
  Un proceso zombi no es lo mismo que un proceso huérfano. Los procesos huérfanos no se convierten en procesos zombis, sino que son adoptados por el programa inicial (ID del proceso = 1), que espera a su hijo.
  El término zombi deriva de la definición común de zombi (una persona no-muerta).
  Los zombis pueden ser identificados en la salida por pantalla del comando ps por la presencia de una "Z" en la columna de estado. Los zombis pueden existir por un corto período, que típicamente significa un error en el programa padre. Igualmente, la presencia de muchos procesos zombi puede indicar problemas en el sistema, y puede acarrear una alta carga del sistema, lentitud y respuestas lentas.
  Para eliminar un proceso zombi existen varias opciones:
  1.   Matar todos los procesos padre que los mantienen: Se buscan todos los procesos padre y se matan forzando su finalización y sustituyendo el PID por el PPID.
  2.   kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`: Tras localizar los procesos zombi, se emplea este comando, que mata todos los que haya (sólo si hay más de uno).
  3.   Apagar o reiniciar el dispositivo informático: Al apagarse el equipo, se cierran todos los procesos activos o difuntos.
  4.   kill -HUP [PPID de proceso]: Elimina el proceso zombi al que correspondiera el PPID dado.
  Para comprobar si cualquiera de estos métodos funciona, se busca de nuevo si aparecen procesos zombi, bien con ps, bien con top o con cualquier otro comando de identificación de procesos.

MONITORIZACIÓN DE PROCESOS POR ENTORNO GRÁFICO

  Los sistemas operativos Linux suelen tener alguna herramienta de interfaz gráfica para monitorizar y gestionar los procesos del sistema (Monitor del sistema, Gestor de tareas, etc.).
  En la sección apropiada para los procesos, puede seleccionarse el proceso a manipular y pulsar el botón derecho del ratón para utilizar las opciones del menú contextual para realizar las acciones que se deseen en este.


 Espero que esta entrada haya sido útil al lector. En caso afirmativo, aguardo que la comente y/o la comparta, por favor.

No hay comentarios:

Publicar un comentario

Deje aquí su comentario, si no puede comentar, pruebe a hacerlo desde otro navegador de red u otro equipo.