Aprende GNU/Linux 3

Los procesos en Linux ( Nivel usuario )

Después de estar un tiempo sin escribir por falta de tiempo debido a exámenes vuelvo con un tema de bastante relevancia, los procesos en Linux. Para hablar sobre los procesos voy a escribir dos artículos, en este voy a tratar los procesos de una forma mas superficial y a nivel de usuario, hablando sobre que es un proceso, los tipos de procesos que hay y los comandos necesarios para realizar la típica administración que puede necesitar un usuario normal. En el segundo voy a tratar de profundizar mas, hablando sobre como funcionan por dentro, como se crean, sus fases y estados, ademas de las llamadas al sistema que interaccionan con estos. Dicho esto, empezamos.

¿ Que es un proceso ?

Un proceso simplemente es un programa en ejecución. Los procesos ademas de la información propia del programa contienen la información necesaria para que el programa interaccione con el sistema.

Tipos de procesos

Child (hijos)
Un proceso hijo es un proceso creado por otro proceso, estos se crean mediante la llamada al sistema fork() y en realidad, todos los procesos en algún momento son hijos, todos menos el proceso init. En el caso de que un proceso sea creado mediante la shell ( ejecutado desde esta ), la shell sera el padre.
Orphan (huérfanos)

Normalmente un proceso hijo termina antes que un proceso padre, pero se puede dar la situación de que se mate a un proceso padre ( killed ) y el hijo se quede sin padre ( que crueldad ). Entonces el proceso init lo adoptara como hijo, pero como su padre original no existe, es considerado huérfano.

Daemon (demonios)
Es un tipo especial de proceso que se ejecuta en segundo plano y no esta asociado a ninguna shell. Esto se consigue matando la shell que crea el proceso, de esta forma el padre de este proceso pasa a ser el proceso init ( queda huérfano ). Estos corren con permisos de root y su cometido es proveer servicios a otros procesos.
Zombie

Cuando un proceso hijo termina, el sistema guarda el PID ( Identificador )  y su estado ( un parámetro ) para dárselo a su padre. Hasta entonces el proceso finalizado entra en estado zombie. Cuando un proceso finaliza toda la memoria y recursos asociados con dicho proceso son liberados, pero la entrada del mismo en la tabla de procesos aún existe, para cuando su padre llame a la función wait() devolverle su PID y estado.

Administración de procesos

Como ya e indicado, esta administración es la necesaria para un usuario normal, sin entrar en temas muy complejos y profundos. La administración de los procesos podemos hacerla mediante la interfaz gráfica o mediante la shell .

 Mediante Interfaz Gráfica

En el caso de la interfaz gráfica varia dependiendo la distribución, por ejemplo en Manjaro xfce ( xfce en general ) seria :
Menú -> Sistema -> Gestor de tareas

El gestor de tareas de xfce tiene el siguiente aspecto:


El gestor nos informa del PID ( Identificador del proceso ), espacio que ocupa y porcentaje del procesador que esta usando, ademas con el botón derecho sobre un proceso, podemos matarlo, terminarlo, detenerlo o cambiar su nivel de prioridad.

Para visualizar los procesos en Ubuntu accedemos al gestor mediante Sistema > Administración > Monitor del sistema. Normalmente todos los gestores ofrecen la misma información y funcionan de una manera muy similar.

 Mediante la shell

Para la administración de procesos en la linea de comandos tenemos unas pocas instrucciones que nos van a ayudar con el cometido. Los comandos están dividido cuatro cometidos, visualización, terminación de procesos, cambio de prioridad y ejecución en segundo plano.

Visualización de procesos

Para visualizar el estado del proceso seleccionado o de todos los procesos tenemos ps:

Comando ps <Wikipedia>
ps (“process status”, estado de procesos) es un comando asociado en el sistema operativo UNIX (estandarizado en POSIX y otros) que permite visualizar el estado de un Proceso (informática).

La sintaxis es la siguiente:

ps [modificadores] [condición]

Donde modificadores es opcional, y puede tomar los siguientes valores:
Los siguientes modificadores no toman el parámetro condición:

  • -A: Muestra todos los procesos (de todos los usuarios en el sistema).
  • -a: Muestra todos los procesos de una [tty] determinada.
  • -d: Muestra todo excepto los líderes de la sesión.
  • -e: Muestra todos los procesos (equivalente a -A).
  • T: Muestra todos los procesos de la terminal actual.
  • a: Muestra todos los procesos de la terminal actual incluyendo los de otros usuarios.
  • g: Muestra todos los procesos incluyendo grupos líderes (obsoleta excepto en sunOs).
  • r: Muestra solamente los procesos corriendo.
  • x: Muestra los procesos en un estilo BSD (sin controlar la [TTY]).

Los siguientes modificadores toman el parámetro condición:

  • -N: Muestra todos los procesos excepto los que encajan con la condición (equivalente a –deselect).
  • -C: Muestra los procesos que tienen como nombre la condición.
  • -G: Muestra los procesos que tienen como grupo (nombre de grupo o id) la condición.
  • -P: Muestra los procesos que tienen como [Identificador de proceso] la condición.
  • -S: Muestra los procesos que tienen como sesión la condición.
  • -U: Muestra los procesos que tienen como usuario (nombre de grupo o id) la condición.

Existen distintos modificadores admitidos según la versión del comando ps que se esté usando en el sistema (BSD, POSIX, GNU, etc.)

También existe -aux que muestra todos los procesos del sistema. Incluido él.

Otra alternativa para la visualización de los procesos es pstree, pstree nos muestra todos los procesos en forma de árbol.

Pero si lo que queremos es monitorizar los procesos en tiempo real disponemos del comando top, este muestra una lista de procesos que se actualiza cada 3 segundos (por defecto). Los procesos están ordenados por el uso de CPU y muestran PID, usuario, %CPU, %MEM.

Terminación de procesos

Para matar un proceso utilizaremos la instrucción kill, que a pesar de su nombre, no es una instrucción para matar procesos. Esta instrucción lo que hace es enviar una señal al proceso, que por defecto, es una señal SIGTERM que solicita al proceso limpiar su estado y salir (matar).

Comando kill <Wikipedia>

Puede enviarse una señal SIGTERM a un proceso (en este caso con el PID 1234) de tres maneras:

killall 1234
killall -TERM 1234
killall -15 1234

( 1234 es el PID del proceso, -TERM es otra forma de referirse a SIGTERM y -15 es la señal numero 15 (SIGTERM) )

Ademas de la señal es posible enviar muchas otras señales, como SIGKILL, HUP, TRAP, INT y ALRM… Para enviar otro tipo de señal al proceso podemos indicar su nombre o su numero ( puede variar entre versión de Unix)

Ademas del comando kill podemos usar el comando killall que enviá la señal que queramos ( por defecto SIGTERM que mata al proceso ) a un conjunto de procesos que trabaja bajo el nombre de un mismo programa.

Ejemplos Comando killall

La sintaxis del comando killall es la siguiente:

killall [opciones] [nombre del programa]

Por ejemplo :

killall nautilus
Cambio de prioridad

Los procesos por defecto traen una prioridad de 0, pero es posible cambiar esta prioridad para que el sistema trate con mas o menos prioridad al proceso en cuestión. Una prioridad de -10 es mayor que una prioridad de 10, por lo que valores mas bajos indican mayor prioridad.

Para cambiar la prioridad de un proceso tenemos la instrucción nice. Nice lo que hace es iniciar un programa con la prioridad que le indicamos, si queremos que la prioridad sea negativa (las mas altas) necesitamos permisos de root ).

Comando nice

La sintaxis del comando nice es la siguiente:

nice -n [prioridad] [comando]

Unos ejemplos serian :

nice -n +5 find
sudo nice -n -5 ls

También es posible cambiar la prioridad de un proceso en tiempo real ( ya ejecutado ) gracias al comando renice. Tanto nice como renice utilizan la misma sintaxis, si quieres mas información consulta man nice o man renice .

Ejecutar procesos en segundo plano

Si queremos ejecutar un proceso en segundo plano (background) se utiliza el comando nohup o el operador &.

Si queremos que la terminal quede liberada de un proceso utilizamos el operador &, esto se utiliza mucho cuando ejecutamos un programa con interfaz gráfica mediante la linea de comandos. Si no utilizamos el operador & (ampersand) después de la llamada al programa la terminal queda inutilizada (esta ejecutando el programa), pero si utilizamos & el programa se ejecuta en segundo plano y podemos seguir llamando a mas programas.

Un ejemplo del ampersand seria:

gedit &

Al finalizar una sesión en un terminal se envía un signal (SIGHUP) a todos los procesos que esté ejecutando nuestro usuario. Como resultado, dichos procesos se mueren (aunque les hayamos puesto & al final). Para evitar esto utilizamos el comando nohup. Este comando hace que un proceso ignore la señal SIGHUP, y redirige la salida de nuestro programa a un archivo nohup.out que es creado en el directorio actual.

Un ejemplo del comando nohup junto al ampersand :

nohup ./script.sh &

donde script.sh es un Script en nuestra situación actual en el sistema de ficheros.

Esto es todo respecto a los procesos a nivel de usuario, espero que os sirva en vuestro día a día y estar atentos si queréis profundizar mas porque dentro de poco sacare el segundo articulo (Los procesos en Linux ( Nivel avanzado )) en el que como ya he comentado hablare de aspectos mas técnicos.

¿ Crees que debería añadir algún comando o mas información para un usuario normal ?

Sobre el autor / 

AsierPH

Entusiasta de las tecnologías libres y fundador de OvToaster.com | “Las obras de conocimiento deben ser libres, no hay excusas para que no sea así“

Articulos relacionados

3 comentarios

  1. carlos 14 noviembre, 2016 at 3:36 am -  Responder

    buena noche, me pueden decir cuales son los procesos comunes que Linux ejecuta y que consecuencias se tendrian, al detenerlos?

    gracias

  2. willarmand 7 junio, 2014 at 5:50 am -  Responder

    Hola, muy interesante y el tutorial; ahora bien, de acuerdo a la interfaz grafica de los sistemas GNU/Linux, los que he probado, no se puede terminar un proceso desde dicha interfaz, sino que de acuerdo a tu explicacion se hace mediante la terminal, con el nombre exacto tal cual aparece en la interfaz grafica, segun entiendo y ademas no me queda claro cuando usar el “kill” y el “killall”, pues, a veces no se sabe cuando un proceso es parte de un conjunto de procesos; ahora bien lo que quiero saber es si no hay en Linux una forma mas rapida de hacerlo mediante un atajo de teclado al estilo Window$ o parecido.
    Saludos

    • AsierPH 18 septiembre, 2014 at 12:37 pm -  Responder

      Buenas! cada entorno gráfico ofrece diferentes formas de realizar atajos de teclado, no te puedo dar una única respuesta porque desconozco como se hace en cada uno de los entornos, pero si que es posible.
      ¡Muchas gracias!

Deja tu comentario

Tu correo no sera publicado. Los campos requeridos están marcados *