¿Qué es un proceso en Linux?
El término proceso a menudo es desconocido para cualquiera que no tenga experiencia en Ciencias de la Computación. Sin embargo, es uno que se usa a menudo cuando se habla de programación de Linux, y los procesos son esenciales para el trabajo de administración del sistema.
Linux también usa el término trabajo para referirse a un concepto muy similar. La diferencia es sutil pero importante, y el control de trabajos es una herramienta útil cuando se ejecuta un entorno multitarea. Puede utilizar una serie de herramientas y comandos integrados para hacer malabares con los trabajos.
¿Qué es un proceso?
En el nivel más simple, puede pensar en un proceso como el equivalente de un programa que ejecuta. Puede ser una aplicación GUI completa, como su navegador web. Podría ser un comando único que se ejecuta en la línea de comandos, como ls . En términos generales, cualquier cosa que suceda en su computadora depende de un proceso, en esencia.
En realidad, una sola aplicación puede utilizar muchos procesos para realizar tareas separadas simultáneamente. Una invocación de línea de comandos que utiliza canalizaciones, como:
$ grep "error" log.txt | wc -l
Ejecutará dos procesos separados, uno para cada segmento de tubería.
Cómo comienzan los procesos
Los procesos son creados explícitamente por usted, el usuario, o automáticamente por su computadora. De hecho, es posible que ya tenga cientos de procesos en ejecución tan pronto como haya iniciado.
Los procesos pueden generar otros procesos e init, el primer proceso que se inicia en muchos sistemas Linux tradicionales, es en última instancia responsable de iniciar cada proceso que se ejecuta.
Cómo terminan los procesos
Muchos procesos son comandos de corta duración que ejecutan una tarea y luego se detienen. Al escribir ls en una terminal, se iniciará, ejecutará y detendrá un proceso en fracciones de segundo.
Algunos procesos, como los demonios , se ejecutan de forma continua. El proceso cron , por ejemplo, ejecuta otros comandos periódicamente mientras su computadora host está funcionando.
Identificación de un proceso
El sistema operativo (SO) asigna un identificador único a cada proceso. Se conoce como PID o ID de proceso. Este valor suele ser un número de 1 a 5 dígitos y los procesos futuros pueden reutilizar el PID de un proceso anterior que se ha limpiado por completo.
Los PID son utilizados por el propio sistema operativo de muchas formas diferentes. Un buen ejemplo es el directorio / proc que almacena información sobre los procesos en ejecución.
¿Qué es un trabajo?
En terminología de Linux, un trabajo es un programa administrado por el shell. Por lo general, consta de un proceso, pero puede utilizar varios. Cuando ingresa un comando en su terminal, se genera un proceso para ejecutar el comando y se crea un trabajo para ayudar a controlar el comando mientras se ejecuta.
Gestionar trabajos
Si está ejecutando un trabajo en primer plano, puede interrumpirlo presionando Control + C (^ C). Por lo general, esto hará que el proceso se cierre y devolverá la terminal a un mensaje.
$ sleep 100
^C
$
Alternativamente, presionar Control + Z (^ Z) detendrá la ejecución del trabajo, pero no hará que finalice. Puedes pensar en ello más como una pausa.
$ sleep 100
^Z
[1]+ Stopped sleep 100
$
Tenga en cuenta que el shell le dice el número del trabajo entre corchetes cuando lo detiene. Esto se puede utilizar con otros comandos para controlar el trabajo. Por ejemplo, puede reiniciar un trabajo llevándolo al primer plano usando fg :
$ fg %1
sleep 100
Puede utilizar un comando similar para reiniciar el trabajo en segundo plano:
$ bg %1
[1]+ sleep 100 &
$
Esto devolverá el control a un mensaje, para que pueda continuar con otros trabajos mientras se ejecuta el trabajo. Si desea que un trabajo se ejecute en segundo plano tan pronto como lo inicie, agregue un & al final del comando:
$ sleep 100 &
[1] 61087
$
En este caso, el shell imprime el número de trabajo entre paréntesis y luego el PID.
Herramientas comunes para interrogar procesos y trabajos
Procesos de seguimiento
Uno de los comandos más útiles para obtener información sobre procesos es top . El programa muestra una vista interactiva en tiempo real de los procesos en ejecución. Es el equivalente en línea de comandos de programas gráficos como el Monitor del sistema de GNOME o el Administrador de tareas de Windows.
Puede iniciar el programa superior con el comando simple, top :

Un área de encabezado muestra la carga de la CPU y el uso de la memoria. Debajo de esto, la parte superior muestra una tabla que contiene un proceso por línea. Los detalles incluyen el PID, cuánta potencia de CPU disponible está usando el proceso y el tiempo total de CPU que ha consumido. La información se actualiza automáticamente, cada tres segundos de forma predeterminada.
Hay muchas opciones y comandos interactivos que pueden usarse para alterar el comportamiento de top. Use el comando man top para leer más:

Obtener una instantánea de los procesos activos
Abreviatura de estado del proceso , el comando ps enumera los procesos. Las diferentes opciones permiten varios filtros y ajustes a los detalles mostrados. Por defecto, ps muestra los procesos que están conectados a un terminal y fueron iniciados por el usuario actual. En otras palabras, la mayoría de los comandos que ha escrito en la línea de comandos.
Con la tarea anterior aún en segundo plano, la salida podría verse un poco así:
$ ps
PID TTY TIME CMD
35564 ttys000 0:00.00 sleep 100
73998 ttys000 0:00.43 -bash
Al igual que con top, ps tiene muchas opciones para controlar su comportamiento, y estas se pueden descubrir a través de man ps :

Dos de los más útiles, que a menudo se combinan, son -e y -f . Muestran procesos que pertenecen a todos los usuarios y columnas adicionales, respectivamente. Por ejemplo:
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 2020 ? 00:11:22 /sbin/init
root 2 0 0 2020 ? 00:00:00 [kthreadd]
...
Listado de trabajos en segundo plano
El comando de trabajos enumera los trabajos en segundo plano en el shell actual. Para demostrar su uso, inicie un trabajo de larga duración en segundo plano:
$ du -skh ~ >/tmp/du.txt 2>/dev/null &
[1] 61167
Este comando calcula el espacio total en disco utilizado por su directorio de inicio, redirigiendo su salida a un archivo temporal.
$ jobs
[1]+ Running du -skh ~ > /tmp/du.txt 2> /dev/null &
Finalmente, cuando se complete el trabajo, aparecerá una línea en su terminal similar a:
[1]+ Exit 1 du -skh ~ > /tmp/du.txt 2> /dev/null
Envío de señales para finalizar procesos
Si ha identificado un proceso que se comporta mal, es posible que deba eliminarlo. Aunque suene drástico, el comando kill es una parte normal de la caja de herramientas del administrador del sistema. Puede enviar cualquiera de varias señales, que son notificaciones estándar para controlar el comportamiento del proceso. Algunas señales comunes para enviar son SIGINT, SIGTSTP, SIGTERM y SIGKILL.
SIGINT es el equivalente a presionar ^ C. SIGTSTP es el equivalente a presionar ^ Z. SIGTERM y SIGKILL son ambos medios para detener un proceso. El primero envía una solicitud al proceso, lo que le da la oportunidad de cerrarse automáticamente. Este último es un método más extremo para forzar el cierre de un proceso y debe utilizarse como último recurso.
El comando kill también puede funcionar con trabajos. Por ejemplo:
$ jobs
[1]+ Running sleep 100 &
$ kill %1
[1]+ Terminated: 15 sleep 100
Trabajar con procesos y trabajos en Linux
Los procesos y los trabajos son conceptos difíciles de comprender, en particular, la diferencia entre ellos. Sin embargo, son uno de los primeros pasos para comprender la administración del sistema en Linux. Los trabajos son un medio práctico para ejecutar diferentes comandos desde el shell simultáneamente.
Los procesos son un concepto de nivel inferior que también se puede manipular y están en el corazón de cada programa que se ejecuta en una computadora.