Señales y Prioridades de procesos en Linux
Table of Contents
ToggleIntroducción
Cuando hablamos de señales y prioridades de procesos en linux, nos referimos a la forma en que estos se comunican entre sí, y el kernel de comunicarse con ellos. Por tal motivo, existe un número determinado de señales que se pueden enviar a un proceso, y cada una de ellas tiene sobre él una acción distinta: pausarlo, reanudarlo, cancelarlo,etc. Conceptualmente, debemos entender que un proceso recibe una señal, y tiene de forma predeterminada que actuar ante la misma. De esta forma, hay un conjunto de señales ante las cuales todos los procesos se comportan igual; sin embargo, hay señales ante las que procesos distintos se comportarán de manera distinta, e incluso habrá procesos que ignoren determinadas señales. Habrá otras que no podrán ignorar (la de detenerse, por ejemplo) porque son comunes a todos los procesos.
Tipos de señales
Las señales se denotan por SIGNAME, donde SIG hace referencia a la señal y NAME es el nombre que se le da a dicha señal. Además, las señales más usadas tienen un número de señal asociado.
Señal | Descripción |
SIGHUP- (num 1) | Causa que un proceso “relea” sus archivos de configuración. Todos losprogramas no implementan esta señal. |
SIGINT- (num 2) | Interrumpir (cancelar) un programa. Es la señal que se le envía a un proceso cuando presionamos Ctrl+C en teclado con un proceso en primer plano. |
SIGKILL- (num 9) | “Matar” un proceso. Los programas no pueden ignorar a esta señal, terminan inmediatamente cuando la reciben. Sólo debería ser usada en el caso de necesitar terminar un proceso que ha dejado de responder y no funciona adecuadamente. Primero intentar enviando la señal SIGTERM y si no funciona SIGKILL. |
SIGUSR1- (num 10) | Señal de usuario. Cada programa puede decidir cómo responder a esta señal. |
SIGSEGV- (num 11) | Señal de violación de segmento (segmentation fault). Esta señal le es enviada a un proceso cuando intenta acceder a memoria que “no es suya”, que está fuera de la zona de memoria que ese proceso puede usar. El proceso es detenido inmediatamente. |
SIGPIPE- (num 13) | Tubería no existente. Esta señal se envía a un proceso que estaba escribiendo a una tubería o pipe cuando el destino de la tubería ya no existe. |
SIGTERM- (num 15) | Terminar. Se envía esta señal a un proceso cuando queremos que termine normalmente, haciendo lo que necesite antes de terminar. |
SIGCHLD- (num 17) | Hijo terminó. Esta señal se envía a un proceso padre automáticamente cada vez que un proceso hijo termina. |
Procesos «zombies»
Bajo circunstancias normales, un proceso hijo actúa bajo el padre que lo ha creado. Cuando el proceso hijo ya no es necesario, desaparece. Sin embargo, a veces, los procesos se convierten en procesos ‘fugitivos’, y aunque no sea necesario que se sigan ejecutando, continúan su ejecución consumiendo recursos innecesarios y haciendo más lento al sistema.
Un proceso padre no puede (y no debe) finalizar su ejecución mientras tenga procesos hijos asociados a él que estén en funcionamiento. Teniendo ésto en cuenta, cuando un proceso hijo no puede finalizar correctamente su ejecución, origina que el proceso padre se quede en un estado inconsistente, y que no pueda, a su vez, terminar su ejecución, quedando el proceso padre (y él o los hijos ‘colgados’) en un estado conocido como ‘zombie‘, haciendo uso de recursos innecesarios del sistema.
Esto puede ocurrir en dos ocasiones:
Primera ocasión:
Un usuario ejecuta un proceso (A), que no puede hacer todo por si mismo, así que ejecuta otro proceso (B), que a su vez ejecuta otro proceso (C). Entonces pueden suceder las siguientes cosas: Bajo condiciones normales, cuando el proceso C termina su ejecución, se lo notifica al proceso B, y desaparece (C). El proceso B trata la información, notifica los datos al proceso A, y muere (B). El proceso A, hace lo propio con los datos recibidos, y retorna la información al shell del usuario, y entonces muere (A).
En condiciones anormales, supongamos que el proceso C, después de pasar la información al proceso padre (el proceso B), no muere. Continúa ejecutándose, lo que impide que el proceso B finalice, dado que tiene un proceso hijo (C) en marcha. El proceso B trata la información y la reporta hacia el proceso padre (A), que a su vez, devuelve la información hacia la shell que lo originó. Tanto el proceso A como el proceso B, no pueden finalizar su ejecución dado que tienen procesos hijos en marcha.
Así pues, un error en el proceso C, el cual hace que se quede en ejecución cuando no debería, origina que hayan tres procesos en marcha en el sistema, consumiendo recursos de forma innecesaria.
Segunda ocasión:
el proceso C, como antes, entra en un estado inestable, y no finaliza su ejecución. Sin embargo, el proceso B, acaba su ejecución y desaparece. El proceso A, también finaliza dado que su hijo, el proceso B, ha finalizado. Así pues, se queda únicamente el proceso C en marcha (en estado inestable), pero ahora, no tiene procesos padre a los que reportar.
Para resolver los problemas que pueden ocasionar estos procesos extraños, se puede usar el comando kill. Los cuales estaremos viendo a continuación.
Comandos para el envío de señales
Dentro del campo de señales y prioridades de procesos en linux, podemos mencionar todas aquellas herramientas de uso fundamental para para indicarle una acción a un proceso. Estas son las siguientes:
Comando kill
El comando kill se usa para enviar señales a los procesos. Incluso, con esta herramienta, podemos indicar varios PIDs para que reciban esa señal en un solo comando.
La sintaxis del comando kill es la siguiente:
# kill (señal) [PID]
Veamos las listas de señales que existen
# kill –l
Comando killall
El comando killall se utiliza para matar múltiples procesos por su nombre
Enviar SIGTERM a todos los procesos httpd:
# killall httpd
También, puede usarse: # kill -15 httpd (o poner el PID)
Enviar SIGKILL al proceso:
# killall -9 PID
Comando pkill
El comando pkill se utiliza para enviar una señal a un proceso utilizando parte de su nombre.
Enviar señal SIGTERM a todos los procesos que contengan htt en su nombre:
# pkill htt
Enviar señal SIGKILL a todos los procesos que contengan htt en su nombre:
# pkill -9 htt
Prioridades de los Procesos
Una vez sepamos el uso y función de las señales, tendremos que conocer las prioridades de procesos en linux. Es decir, de la misma forma que los directorios/ficheros tienen permisos y prioridades, lo mismo ocurre con los procesos. Un ejemplo básico puede ser cuando necesitamos que un alguno corra con más prioridad, dado que necesita el control total de, por ejemplo, una unidad específica.
Comando nice
Uno de los parámetros usados por el Kernel para asignar prioridades, es el comando nice . Esta prioridad consta de una numeración que va a indicar el nivel de prioridad que posee un proceso. De manera predeterminada la prioridad tiene un valor cero.
Los números positivos son los de menor prioridad y los negativos los de mayor prioridad. El rango va de -20 a +19 .
Un usuario normal puede iniciar procesos con números positivos, pero solamente el usuario root puede utilizar la asignación de números negativos.
Sintaxis:
nice (-n adjustment) [command ]
nice (-adjustment) [command ]
Un usuario normal, podrá tener un nivel de nice de 1 a 19; en cambio, si estamos logueados como root, de -20 a 19. El valor por defecto que toma es 10.
Iniciar el comando cp con alta prioridad ( -20 )
# nice -n -20 cp -rf /etc /backup
Iniciar el comando cp con baja prioridad ( 19 )
# nice -n 19 cp -rf /etc /backup
Listar los procesos y mostrar la prioridad (columna NI )
# ps –fel
Tambien podemos hacer:
# ps alx
Comando renice
Con el comando renice se puede cambiar la prioridad de un proceso que ya se encuentra en ejecución.
Sintaxis:
renice [+|-]prioridad [opción]
Opciones:
-u Indica a los procesos de que usuario le va a cambiar la prioridad.
-p Indica el PID (ID de proceso) al que se le cambiará la prioridad
Cambiar la prioridad a 19 del proceso 20801:
# renice 19 -p 20801
20801: old priority -4, new priority 19
Cambiar la prioridad a -19 del proceso 20804:
# renice -19 -p 20804
0: old priority -10, new priority -8
20804: old priority -8, new priority -8