Procesos
El hecho de que el sistema operativo sea multitarea implica que podamos ejecutar más de un programa a al vez. Un proceso noe s más que un programa o aplicación cargado en memoria y ejecutándose. Aunque nuestro ordenador sólo disponga de una CPU, el sistema operativo se encarga de repartir el tiempo de procesamiento de la misma para que varios procesos puedan ir ejecutando sus operaciones, dando la sensación de una ejecución paralela.
Para identificar de forma inequívoca cada proceso, el núcleo del sistema les asigna un número llamado
PID (Process IDentification). Aunque podríamos pensar que sólo con el nombre ya tendríamos suficiente para identificarlo, es imprescindible tener el
PID ya que podemos ejecutar un proceso tantas veces como queramos (tendríamos varias instancias del mismo proceso, pero cada una con un
PID distinto).
Mostrando los procesos
Para ver que procesos están ejecutándose, utilizaremos el comando
ps. Las opciones más importantes y utilizadas de este comando son:
-a para mostrar los procesos de todos los teminales,
-u para mostrar el usuario al que pertenece el proceso y la hora de inicio, y
-x para mostrar procesos que no estan controlados por ningún terminal. Suelen usarse combiandas para tener una visión global de los procesos que están en ejecutan. Unos ejemplo serian:
$ ps -aux
$ ps -u
Con el primer comando veríamos todos los procesos en ejecución y con el segundo sólo los que nos pertenecen (hemos omitido las opciones
a y
x).
Otros dos comandos útiles a la hora de visualizar los procesos son:
pstree, que nos muestra los procesos en una estructura de árbol; y
top, que nos muestra todos los procesos, lo que consumen de CPU, de Memoria, etc. Con este último tenemos la información actualizada en pantalla hasta que cerramos el programa. (Para salir de
top hay que pulsar 'q').
Enviando señales a los procesos
Aparte de informarnos sobre los procesos, el sistema operativo nos permite también enviarles señales para informarles de algún evento: quitarlos de la cola de ejecución, terminarlos, aumentar su prioridad, etc. En este apartado veremos como enviar señales para terminar aquellos procesos que se nos puedan haber quedado colgados,
zombies, o simplemente consuman demasiada CPU en un momento determinado.
Sobre los procesos, sus propietarios y sus permisos
En los sistemas operativos GNU/Linux, los procesos pertenecen al usuario que los lanzó. Asimismo, se ejecutan con los mismos permisos que tiene ese usuario. Esta es una medida de seguridad bastante importante ya que así otros usuarios no podrán terminar procesos que no les pertenezcan, y un proceso presuntamente maligno lanzado por un usuario no afectaría al sistema ni a otros usuairos, ya que el usuario que lo lanzó no tiene permisos.
Esta es una de las razones por la que existen realmente pocos virus efectivos en los sistemas operativos basados en UNIX. Un virus no es más que un proceso lanzado por el usuario infectado, y como tal, sólo tiene los permisos que pueda tener el usuario, así que no comprometería la seguridad del sistema ni a otros usuarios.
Terminando procesos
El comando usado para enviar señales a los procesos es
kill, pero el nombre puede ser engañoso: NO TODAS LAS SEÑALES PASADAS CON
kill SON PARA MATAR O TERMINAR PROCESOS, aunque nosotros nos centraremos en ellas.
Hay dos formas básicas de terminar un proceso:
$ kill -TERM <PID>
$ kill -KILL <PID>
Con la primera informamos al proceso (en el comando hay que especificar el
PID del proceso, no el nombre) que queremos que termine, pero dejamos que guarde su información y finalice de forma correcta. El segundo es más bestia; cuando un proceso está
zombie, colgado o no responde, usamos este para eliminarlo directamente de la cola de ejecución. Si queremos matar procesos de forma más cómoda, podemos usar el comando:
killall <nombre_proceso>.
Otro comando útil es
skill uqe nos permite enviar señales a los procesos de forma distinta. Por ejemplo, si queremos detener todas las ejecuciones de un determinado usuario podríamos utilizar:
skill -STOP -u <nombre_usuario>, con lo que todos los procesos de dicho usuario terminarían.
Cuando estamos ejecutando un programa en consola y queremos terminarlo, podemos enviar directamente la señal TERM con el atajo
CTRL+C, y podemos pausarlo con
CTRL+Z y devolverlo luego a primer plano con
fg.
Cambiando la prioridad de los procesos
Todos los procesos tienen una prioridad. Como decíamos antes, esta prioridad indica el tiempo de CPU que se le dará al proceso apra que se ejecute antes de pasar a ejecutar el siguiente proceso en la cola de ejecución. El rango de prioridades va
desde -20 a 19 siendo -20 la máxima prioridad.
Para lanzar un proceso con una determinada prioridad utilizamos el comando
nice. Si queremos cambiar la prioridad de un proceso en ejecución utilizaremos el comando
renice. Sólo
root puede utilizar el rango de prioridades negativas, así el sistema se asegura que
root siempre pueda ejecutar procesos más rápidamente que el resto de usuarios. Por defecto, la prioridad con que se ejecutan los procesos es 0.
Un aspecto a tener en cuenta es que no podemos medir directamente el tiempo de ejecución de un proceso, ya que se van alternando en la cola de ejecución hasta que terminan; no se ejecutan todos de vez. Para medir el tiempo de ejecución real e un proceso podemos lanzar el proceso añadiendo antes del comando la palabra
time.
Tutorial elaborado por
Nacx para ADSLAyuda.com