Skip to content

Latest commit

 

History

History
567 lines (369 loc) · 16.1 KB

Procesos.org

File metadata and controls

567 lines (369 loc) · 16.1 KB

Procesos

Los procesos (o tareas) son instancias de programas en ejecución.

Cada proceso tiene asociado un identificador llamado PID.

Clasificación

Los procesos se pueden clasificar como:

  • Foreground o primer plano, son los procesos que tienen el control directo de una terminal, permitiendo que el usuario interactúe en tiempo real
  • Background o segundo plano, son los procesos que se ejecutan independientemente de la terminal, dejándola libre para aceptar otro comandos

Para levantar un proceso en segundo plano hay que agregar el símbolo & después del comando, por ejemplo:

vi &
[1] 11698

top

El comando top permite controlar los procesos y las estadísticas del uso de los recursos del sistema en tiempo real (por defecto cada 3 segundos).

assets/top.png

Columnas

  • PID para el identificador de proceso (Process ID)
  • USER para el usuario dueño del proceso
  • PR para la prioridad del proceso (Priority)
  • NI para el valor de amabilidad del proceso (Niceness)
  • VIRT para la memoria virtual total usada por el proceso (Virtual Memory)
  • RES para la memoria física actualmente usada por el proceso (Resident Memory)
  • SHR para la memoria compartida usada por el proceso (Shared)
  • S para el estado del proceso (State)
  • %CPU para el porcentaje de CPU usado por el proceso
  • %MEM para el porcentaje de memoria física usada por el proceso
  • TIME+ para el tiempo total de CPU utilizado por el proceso desde que inició
  • COMMAND para el comando que inició el proceso

Prioridades de procesos

Prioridad base

Es un valor predeterminado que el sistema operativo Linux asigna a todos los procesos de usuario cuando se crean.

Suele ser 20 por defecto.

Amabilidad

Representado por la columna NI, es un valor entre -20 y 19 que el usuario puede ajustar para influir en cierta medida en la prioridad efectiva de un proceso.

Su valor por defecto suele ser 0, pero algunos sistemas UNIX suelen ajustarlo a 5 solo para los procesos en segundo plano para asegurarse que no interfieran con el resto.

Prioridad efectiva

Representado por la columna PR, es un valor que determina cuánto tiempo de CPU recibe el proceso: valores más bajos indican mayor prioridad.

Se calcula con la formula Prioridad efectiva = Prioridad base + Amabilidad o PR = PB + NI.

Estados comunes

Los códigos de estados comunes (que podemos encontrar en el comando top) son:

  • R por ejecutándose (Running)
  • S por durmiendo (Sleeping)
  • D por sueño ininterrumpible por operaciones de E/S (Disk sleep)
  • Z por zombi (Zombie)
  • T por suspendido (Terminated)
  • I por inactivo (Idle)

ps

El comando ps se utiliza para mostrar información sobre los procesos en ejecución en el sistema para ese instante.

ps
PIDTTYTIMECMD
6391?00:00:00bash
6392?00:00:00ps

Opciones

-e o -A

Con la opción -e o -A (“all processes” o “todos los procesos”) podemos ver todos los procesos del sistema

ps -e | head -2
PIDTTYTIMECMD
1?00:00:00init

aux

Con la opción aux podemos ver todos los procesos con detalles adicionales, incluyendo procesos no asociados con una terminal.

ps aux | head -2
USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND
root10.00.025121664?Ss18:020:00init[3]

Es una combinación de los indicadores:

  • a, que muestra todos los procesos asociados con cualquier terminal
  • u, que muestra informacion detallada sobre los procesos, incluyendo el nombre del usuario propietario
  • x, que muestra procesos que no están asociados con ninguna terminal

pstree

El comando pstree se usa para mostrar una representación jerárquica de los procesos en ejecución en el sistema.

Esta representación se organiza en forma de un árbol, donde cada proceso se muestra como un nodo, y los procesos secundarios se muestran como subnodos debajo de sus procesos padres correspondientes.

pstree

kill

El comando kill se utiliza para enviar señales a procesos específicos, lo que puede resultar en la terminación de esos procesos, la modificación de su comportamiento o la ejecución de otras acciones según la señal enviada.

Señales

Para ver los tipos de señales disponibles se puede utilizar la opción -l del comando.

kill -l
1) SIGHUP2) SIGINT3) SIGQUIT4) SIGILL5) SIGTRAP
6) SIGABRT7) SIGBUS8) SIGFPE9) SIGKILL10) SIGUSR1
11) SIGSEGV12) SIGUSR213) SIGPIPE14) SIGALRM15) SIGTERM
16) SIGSTKFLT17) SIGCHLD18) SIGCONT19) SIGSTOP20) SIGTSTP
21) SIGTTIN22) SIGTTOU23) SIGURG24) SIGXCPU25) SIGXFSZ
26) SIGVTALRM27) SIGPROF28) SIGWINCH29) SIGIO30) SIGPWR
31) SIGSYS34) SIGRTMIN35) SIGRTMIN+136) SIGRTMIN+237) SIGRTMIN+3
38) SIGRTMIN+439) SIGRTMIN+540) SIGRTMIN+641) SIGRTMIN+742) SIGRTMIN+8
43) SIGRTMIN+944) SIGRTMIN+1045) SIGRTMIN+1146) SIGRTMIN+1247) SIGRTMIN+13
48) SIGRTMIN+1449) SIGRTMIN+1550) SIGRTMAX-1451) SIGRTMAX-1352) SIGRTMAX-12
53) SIGRTMAX-1154) SIGRTMAX-1055) SIGRTMAX-956) SIGRTMAX-857) SIGRTMAX-7
58) SIGRTMAX-659) SIGRTMAX-560) SIGRTMAX-461) SIGRTMAX-362) SIGRTMAX-2
63) SIGRTMAX-164) SIGRTMAX

Por defecto kill utiliza la señal SIGTERM (15) que permite al proceso una terminación ordenada.

Además, las señales de relevancia para nosotros son:

  • SIGINT para interrumpir procesos (2)
  • SIGKILL para forzar la terminación de procesos (9)

Uso

Para enviar una señal a un proceso, se debe utilizar la familia de opciones -<N> donde N es el número de señal.

vi &
[1] 11734

Por ejemplo, para terminar abruptamente (señal SIGKILL) el proceso creado (de PID 11734), se utiliza como opción el número correspondiente a esa señal (9), y como argumento el PID del proceso:

kill -9 11734
[1]+  Stopped                 vi

nice

El comando nice se utiliza para iniciar un nuevo proceso con un valor de amabilidad (NI) ajustado, afectando su prioridad efectiva (PR).

El valor de amabilidad a usar se especifica con la opción -n, sino se usa el valor por defecto 10.

Uso

Para iniciar un proceso con un valor de amabilidad de -10:

sudo nice -n -10 comando

Se requiere permisos de superusuario para establecer valores de amabilidad negativos, dado que se está incrementando la prioridad del proceso, lo cual generalmente está restringido a usuarios con privilegios administrativos.

Prueba

Para comprobarlo, podemos lanzar dos proceso iguales y utilizar el comando nice solo en uno:

sleep 10
nice -n 10 sleep 10

Ahora controlamos los valores de amabilidad de ambos procesos:

ps -o pid,ni,cmd -C sleep
PIDNICMD
324380sleep10
3246810sleep10

Como observamos en la segunda columna, el primer proceso fue lanzado con la amabilidad por defecto 0, mientras que el segundo con la amabilidad especificada de 10.

renice

El comando renice se utiliza para cambiar la amabilidad (y de consecuencia la prioridad) de un comando que ya está en ejecución, sin tener que reiniciarlo.

Uso

Para cambiar la amabilidad de un proceso a 10:

renice 10 pid

Como con el comando nice, en le comando renice para incrementar la prioridad de un proceso, o sea reducir su amabilidad, se requieren permisos de superusuario.

Prueba

Para comprobar el funcionamiento, podemos lanzar una instancia de un proceso en segundo plano:

vi &
[1] 11609

Luego podemos modificar su prioridad a -10.

sudo renice -10 11609
11609 (process ID) old priority 0, new priority -10

Relativo

Por razones históricas, la mayoría de las implementaciones de renice hoy no siguen la especificación POSIX.

Ésta declara que el comando renice debe cambiar la amabilidad de manera relativa a su valor actual.

Por lo tanto el comando renice, por defecto va a fijar la amabilidad directamente como el valor proporcionado por el usuario.

Para estar seguro de que la amabilidad se incremente o disminuya, en lugar de fijarla, se puede utilizar la opción --relative.

Por lo tanto, si se desea incrementar de 1 la amabilidad del proceso anterior, en lugar de fijarlo en el valor 1, se puede utilizar el comando:

renice --relative 1 11609
renice --relative 1 11609
11609 (process ID) old priority -10, new priority -9
11609 (process ID) old priority -9, new priority -8

Pueden observar que la amabilidad, en lugar de fijarse en el valor 1, se incrementa dos veces.

jobs

El comando jobs se utiliza para listar los trabajos (jobs) en segundo plano que están asociados con la sesión actual del intérprete de comandos (shell).

jobs

Opciones

vi &
[1] 11585

-l

Con la opción -l podemos ver información adicional sobre cada trabajo, incluyendo el identificador de trabajo, el estado y el PID de cada proceso dentro del trabajo.

jobs -l
[1]+ 11585 Stopped (tty output)    vi

-r

Con la opción -r podemos ver los procesos que se encuentran en estado de ejecución (Running).

sleep 10 &
jobs -r
[1] 28383
[1]+  Running                 sleep 10 &

-s

Con la opción -s podemos ver los procesos que se encuentran en estado suspendido (Stopped).

jobs -s
[1]+  Stopped                 vi

fg

El comando fg permite mover un trabajo suspendido en segundo plano al primer plano de la sesión del shell actual.

El comando se escribe de la forma:

fg %trabajo

Donde trabajo es el número de trabajo o el identificador del mismo.

Uso

Lanzamos un proceso:

vi &
[1] 14720

Para traerlo de vuelta a primer plano:

fg %1

bg

El comando bg se utiliza para poner en ejecución un trabajo suspendido, pero en segundo plano de la sesión del shell actual.

El comando se escribe de la forma:

bg %trabajo

Donde trabajo es el número de trabajo o el identificador del mismo.

Uso

Lanzamos un proceso:

vi &
[1] 15050

Para traerlo de vuelta a primer plano:

bg %1
[1]+ vi &

at

El comando at se utiliza para ejecutar comandos en momentos específicos en el futuro.

La sintaxis básica del comando es:

at tiempo

Donde tiempo es la hora en la que se desea que se ejecute el comando. Los especificaciones de tiempo pueden ser bastante complejas.

Luego, se pedirá de ingresar los comandos que se desean ejecutar.

Formatos de tiempo

La forma más básica de ingresar un tiempo es a través del formato HH:MM:

at 15:00

Lo mismo también se puede escribir utilizando los sufijos AM o PM (y sus formas en minúsculas), por ejemplo:

at 3 PM

También hay soporte para los momentos de la jornada, usando:

  • midnight para medianoche
  • noon para el mediodía
  • teatime que es equivalente a las 4 PM
at noon

Si se desea especificar un día se puede utilizar la forma MONTH-NAME DAY, donde MONTH-NAME es el nombre del mes abreviado en inglés, y DAY es el número de día:

at Jan 3

Son igualmente validos los patrones:

  • MMDD[CC]YY
  • MM/DD/[CC]YY
  • DD.MM.[DD]YY
  • [CC]YY-MM-DD

Donde los corchetes delimitan caracteres opcionales y las letras corresponden a:

  • D por el día
  • M por el mes
  • C por las primeras dos cifras del año (opcional)
  • Y por las últimas dos cifras del año
at 12/03/2050

Encima se puede declarar el tiempo como MOMENT + COUNT TIME-UNITS, donde MOMENT es un punto en el tiempo, COUNT es un número y TIME-UNITS puede ser:

  • minutes para minutos
  • hours para las horas
  • days para los días
  • weeks para las semanas

También se aceptan sus versiones en singular sin la s final:

at now + 1 minute

Por ultimo, pueden observar que hay sufijos de tiempo, los cuales son:

  • now para ahora
  • today para hoy
  • tomorrow para mañana

Ejemplos

Para correr un trabajo a las 4 de la tarde, de hoy a 3 días, se usa:

at 4pm + 3 days

Para correr un trabajo a las 10 de la mañana el 6 de julio, se usa:

at 10am Jul 6

Para correr un trabajo a la 1 de la mañana de mañana, se usa:

at 1am tomorrow

atq

El comando atq (”at queue” o “cola de at”) se usa para ver las tareas programadas con el comando at:

atq

atrm

El comando atrm (”at remove” o “remover de at”) se usa para remover una planificación de at antes de que haya ejecutado, utilizando su número de tarea.

atrm 1

crontab

El comando crontab se utiliza para programar la ejecución periódica de tareas.

Con la opción -e, crontab permite seleccionar un editor de texto (si ya no esta configurado), y con el mismo permite al usuario editar la planificación de las tareas.

crontab -e

La ejecución de estas tareas queda a cargo de un demonio, llamado cron, que cada minuto se despierta y controla el archivo donde está definida la planificación (normalmente ubicado debajo de /etc), y si se cumplen las condiciones establecidas por el usuario entonces se ejecuta la tarea correspondiente.

Formato

Una planificación tiene el siguiente formato:

* * * * * comando
│ │ │ │ │
│ │ │ │ │
│ │ │ │ └────── Día de la semana (0 - 7) (Domingo es 0 o 7)
│ │ │ └──────── Mes (1 - 12)
│ │ └────────── Día del mes (1 - 31)
│ └──────────── Hora (0 - 23)
└────────────── Minuto (0 - 59)

Todos los campos deben estar presentes.

Uso

Para ejecutar un comando todos los días a las 2 y media de la mañana:

30 2 * * * comando

Para ejecutar un comando cada 15 minutos:

*/15 * * * * comando

Para ejecutar un comando todos los lunes a las 5 de la tarde:

0 17 * * 1 comando

Para ejecutar un comando el primer día de cada mes a medianoche:

0 0 1 * * comando