¿En qué podemos ayudarte?
Ejecución de procesos
Introducción a los procesos
Un proceso es la representación de un programa en ejecución y, al mismo tiempo, todos los elementos de su ejecución como son memoria, estado, identificación, propietario, padre, etc.
Entre los datos que se identifican en un proceso encontramos:
- PID (Process ID, número de proceso único): en sistemas tipo UNIX-Like se enumera cada proceso con el fin de poder ser diferenciado de otros. El proceso 1 es el iniciado por el sistema conocido como init. Ningún PID se repite y a su vez iniciar un programa múltiples ocasiones generará PIDs diferentes.
- PPID (Parent Process ID, Número de proceso padre): cada proceso puede tener subprocesos llamados procesos hijos (child process). Cada proceso hijo debe contener, entre toda su información, el PID del proceso padre que lo inició. Todos los procesos tienen un PPID salvo el proceso 0, que es un seudoproceso que representa el inicio del sistema (crea el 1 init).
- UID y GID (número de usuario y de grupo): corresponde al UID y al GID de la cuenta de usuario que inició el proceso. El sistema lo utiliza para determinar, a través de la cuenta, los permisos que el proceso tiene para acceder a los recursos. Los procesos hijos heredan ambas cuentas. Es posible modificar este comportamiento en algunos casos.
- Duración y prioridad del proceso: la duración del proceso corresponde al tiempo de ejecución consumido desde la última invocación. En ambientes multitarea, el tiempo de procesador se comparte entre los procesos y no todos tienen la misma prioridad. Los procesos de más alta prioridad son ejecutados primero. Cuando un proceso está inactivo, su prioridad aumenta con el fin de tener la oportunidad de ser ejecutado. Cuando está activo, su prioridad baja con el fin de dejar paso a otro. El planificador de tareas del sistema es el que gestiona las prioridades y los tiempos de ejecución.
- Directorio de trabajo activo: después de su inicio, se configura el directorio actual del proceso (desde el cual se inició). Este directorio servirá de base para las rutas relativas.
- Archivos abiertos: tabla de los descriptores de archivos abiertos. Por defecto al principio sólo hay tres presentes: 0, 1 y 2 (los canales estándar). Con cada apertura de archivo o de nuevo canal, la tabla se rellena. Al cierre del proceso, se cierran los descriptores (en principio).
Puede encontrar más información, como el tamaño de la memoria asignada, la fecha de inicio del proceso, el terminal de atribución, el estado del proceso, los UID efectivo y real, así como los GID efectivo y real.
Estados de un proceso
Durante su vida (tiempo entre el inicio y la salida) un proceso puede pasar por diversos estados o process state:
- ejecución en modo usuario (user mode);
- ejecución en modo núcleo (kernel mode);
- en espera E/S (waiting);
- dormido (sleeping);
- listo para la ejecución (runnable);
- dormido en el swap (memoria virtual);
- nuevo proceso;
- fin de proceso (zombie).
Debido a que Linux es multitarea/multiproceso, al iniciar el sistema y acceder a él existe un determinado número de procesos que ya se ejecutan en su máquina sin que sean visibles para el usuario. Del mismo modo, la terminal es un proceso. Al escribir una instrucción crea un nuevo proceso para ejecutarlo, este proceso se convierte en un proceso hijo del shell. Una vez iniciado, hay que esperar al final de su ejecución para iniciar el siguiente (excepto si se utiliza “;” para encadenar los comandos).
Por cada instrucción que se escribe en la terminal es necesario esperar a que finalice para poder lanzar la siguiente, sin Un proceso es la representación de un programa en ejecución y, al mismo tiempo, todos los elementos de su ejecución como son memoria, estado, identificaciónembargo, es posible insertar otra instrucción sin la necesidad de esperar que la previa haya finalizado. Para ello, basta insertar, después de haber tecleado la instrucción, el ampersand “&”. En este caso, la terminal y la instrucción iniciado funcionarán en paralelo.
ls -R / > ls.txt 2> /dev/null &
[1] 19092
[1]+ Salida 2 ls -R / > ls.txt 2> /dev/null
ls
ls.txt
Justo después de la inserción, aparece un número que es el PID del nuevo proceso iniciado en segundo plano.
Algunas observaciones en cuanto al uso del segundo plano:
- El proceso iniciado en segundo plano no deberá ser otra terminal, esto produciría confusión entre este comando y la propia terminal.
- El proceso iniciado no debería mostrar resultados en la pantalla porque entrarían en conflicto con los de la terminal (por ejemplo, aparición de una línea en medio de una inserción).
- Finalmente, cuando se sale de la terminal, se sale también de todos sus hijos: en este caso, no cierre la terminal en mitad de un procesamiento importante.
Background, foreground, jobs
Puede retomar el control del shell si ha iniciado un proceso en segundo plano. Puede pararlo de
manera temporal tecleando [Ctrl] Z:
sleep 100
^Z
[1]+ Detenido sleep 100
Se ha parado el proceso: se ha suspendido su ejecución hasta que vuelva a ponerlo en primer plano con el comando fg (foreground):
fg
sleep 100
Cuando ejecuta un comando, obtiene un número entre llaves: es el número de job. Puede obtener una lista de todas las tareas con el comando jobs.
jobs
[1]- Stopped sleep 100
[2]+ Stopped sleep 100
Los comandos bg y fg permiten actuar en estos jobs tomando como parámetro su número. Se ejecuta el comando bg en un job parado para iniciarlo de nuevo en segundo plano. Se vuelve a iniciar el job 2 en segundo plano:
bg 1
[1]+ sleep 100 &
[1]- Hecho sleep 100
Video: Ejemplo del uso de bg, fg y jobs
Video del uso de bg, fg y jobs.
Puede informarse más del tema en el artículo Administración de procesos.