====== Administración de procesos ====== Un proceso es un programa que se está ejecutando, ya sea por el usuario o por el sistema Linux.\\ Linux puede ejecutar programas en segundo plano "transparentes al usuario", así como varios programas al mismo tiempo, por lo que se le denomina "multitarea".\\ Cuando un programa se está ejecutando en segundo plano hasta el infinito, se denomina "demonio" y suele llevar como última letra la **d**. Ejemplo: httpd (servidor web apache), crond (planificador de tareas de Linux), etc.\\ Todo proceso se identifica con un número de identificación denominado PID (//Process IDentifier//).\\ Para crear procesos, el núcleo Linux provee de dos instrucciones (existentes en cualquier lenguaje de programación): * **fork**: crea un proceso "hijo" de uno principal. * **exec**: ejecuta el código que sea necesario en ese proceso. De esta forma, todo proceso es hijo de otro, creándose de esta manera un árbol de procesos.\\ El primer proceso del sistema Linux es **init**, su PID es 1 y todos los demás cuelgan de él. No es posible conocer a priori el PID de cualquier otro proceso hijo. ===== Visualización de procesos ===== ==== ps ==== Permite ver la lista de procesos del sistema. Extrae toda la información del pseudosistema de archivos **/proc** en el que el núcleo de Linux coloca toda la información respecto al estado del sistema en curso de ejecución.\\ Tiene muchas opciones, que conviene consultarlas con la opción --help((La versión en español del manual puede estar obsoleta en algunos casos. Pueden verse las páginas del manual en el lenguaje internacional ANSI C (aunque se haya instalado la distribución en español) modificando la variable de entorno $LANG, escribiendo **LANG=C** en el //shell//.)), aunque de forma predeterminada muestra únicamente los procesos iniciados por el usuario desde el terminal.\\ Opciones comunes: * **ps aux**: Muestra los procesos de todos los usuarios(**a**), y los que no están vinculados a un terminal (**x**), especificando el nombre de usuario y la fecha de inicio (**u**). * **ps -ef**: Muestra todos los procesos(**-e**) y mucha información (**-f**). * **%CPU** Porcentaje de tiempo que se ha usado el procesador desde la ejecución del comando. * **%MEM** Porcentaje de uso de la memoria disponible. * **COMMAND** o **CMD** Nombre del comando que originó el proceso. * **GID** o **GROUP** Identificación del grupo bajo el que se ejecuta el proceso. * **NI** Nivel de prioridad del proceso. * **PID** Identificación del proceso. * **PPID** Identificación del proceso padre. * **RSS** Cantidad de memoria RAM utilizada en KB. * **START** o **STIME** Fecha de lanzamiento del proceso. * **STAT** Estado del proceso. Definido por tres caracteres: * El primer carácter puede tomar alguno de estos valores: * **R** Proceso ejecutándose (//Running//). * **T** Proceso parado (//sTopped//). * **S** Proceso dormido (//Sleeping//), esto es, en espera del procesador. * **D** Proceso dormido en espera de un recurso (//Device//, normalmente de entrada/salida). No pueden interrumpirse. * **Z** Proceso terminado. Se quedará en este estado hasta que el proceso padre se de cuenta y recupere su código de retorno (//Zombie//). No pueden interrumpirse. * **TIME** Tiempo total de uso de la CPU para este proceso. * **TT** o **TTY** Terminal al que está vinculado el proceso. Si no está asociado a ninguno (como un demonio) aparece el carácter **?**. * **UID** o **USER**: Identificación del usuario bajo el que se ejecuta el proceso. ==== top ==== Permite visualizar la actividad del procesador en tiempo real.\\ Tiene las mismas etiquetas que la instrucción **ps**, siendo posible modificar las columnas de información presentes y la ordenación de los procesos.\\ Con la tecla **[?]** visualizamos la ayuda del comando, y con la tecla **[q]** salimos de top. Para modificar los campos usamos la tecla **[f]**. También se puede enviar señales a los procesos con la tecla **[k]**.\\ Podemos usar el archivo de configuración **/etc/toprc** para establecer una configuración global para todos los usuarios y otro en **~/.toprc** (directorio personal del usuario), para establecer una configuración personalizada. ==== pstree ==== Muestra los nombres de los procesos de forma jerárquica, lo que nos permite ver rápidamente la filiación de los mismos.\\ Con la opción **-p** se muestra el PID de cada uno de ellos.\\ Este comando muestra una línea cuando existen varias instancias del mismo proceso, y el número que aparece delante de ***** indica el número de instancias correspondientes. ==== Monitor del sistema ==== Aplicación gráfica que podemos iniciar escribiendo en el lanzador **Monitor del sistema**. Este programa tiene 3 pestañas que muestran diferente información: * **Procesos**: Muestra los procesos que están funcionando en el sistema, así como información acerca de los mismos: ID, recursos que utilizan (memoria, %CPU), Usuario que lo ejecuta, etc. Pulsando el botón derecho sobre cada uno, podemos realizar algunas acciones sobre él (cambiar prioridad, detener, finalizar, etc). Podemos seleccionar los procesos que queramos ver filtrando por: si lo hemos ejecutado nosotros, sólo los activos o todos, así como si deseamos ver las dependencias. * **Recursos**: Gráficas de uso de memoria, %CPU y red. * **Sistemas de archivos**: Información acerca del % de uso del espacio de las particiones en uso por el sistema. ===== Señales: kill y killall ===== Los comandos **kill** y **killall** permiten enviar señales a los procesos. \\ El comando **kill** espera un número de proceso como argumento, mientras que **killall** espera un comando. **killall** debe usarse con precaución, ya que envía la señal a todos los procesos con el nombre pasado como argumento.\\ En ambos procesos es posible especificar la señal a enviar, aunque de forma predeterminada envían la señal 15 (SIGTERM, termina el proceso). Para obtener la lista completa de señales, se ejecuta **kill -l**. Para obtener información acerca de las señales, puede consultarse el manual, de la forma **man 7 signal**, así como leer el archivo **/uar/include/asm/signal.h**. ===== Trabajo con procesos ===== ==== Iniciar un proceso. ==== Para iniciar un proceso, basta con introducir en el terminal el comando correspondiente. Esto hará que el proceso se ejecute en primer plano.\\ Si deseamos que el proceso se ejecute en segundo plano, y de esa forma no dejar sin uso el terminal, mientras éste se ejecuta, basta con introducir el carácter **&** al final de la línea del comando. Aparecerá entonces el PID de este proceso de forma informativa.\\ ==== Detener un proceso ==== En caso de que el proceso se ejecute en primer plano, hay tres maneras de pararlo: * **ctrl + c**: Se envía la señal 2 (SIGINT, finalización del proceso por interrupción desde el teclado) al proceso. * **ctrl + \**: Se envía la señal 3 (SIGQUIT, finalización del proceso, previo guardado del espacio de memoria en un archivo llamado //core// (útil para la depuración de aplicaciones). * Identificar el PID del proceso en otro terminal, y usar el comando **kill** de forma adecuada. En el caso de que el proceso se esté ejecutando en segundo plano, sólo puede detenerse identificando su PID y deteniéndolo a través del comando **kill**. ==== Control de procesos ==== Al ser posible ejecutar varios procesos desde el mismo terminal al mismo tiempo (ya que algunos pueden estar ejecutándose en segundo plano), son necesarios algunos comandos para controlarlos. === jobs: lista de procesos === El comando **jobs** lista la lista de procesos que han sido iniciados desde el terminal actual. === bg y fg: toma de control de proceso === Si un proceso largo se ha iniciado en primer plano por error, no es necesario interrumpirlo para iniciarlo en segundo plano.\\ Hay que seguir estos pasos: - **ctrl + z**: El proceso se suspende y el usuario puede tomar de nuevo el control del terminal. - Se puede volver a ejecutar el proceso en primer plano con el comando **fg**, o en segundo plano con el comando **bg**. - Para ello hay que introducir como argumento el número de //job// del proceso (entre corchetes, cuando se ejecutra el comando **jobs**) precedido por **%** (sin espacios).