Los procesos (o tareas) son instancias de programas en ejecución.
Cada proceso tiene asociado un identificador llamado PID.
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
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).
PID
para el identificador de proceso (Process ID)USER
para el usuario dueño del procesoPR
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 procesoTIME+
para el tiempo total de CPU utilizado por el proceso desde que inicióCOMMAND
para el comando que inició el proceso
Es un valor predeterminado que el sistema operativo Linux asigna a todos los procesos de usuario cuando se crean.
Suele ser 20
por defecto.
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.
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
.
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
)
El comando ps
se utiliza para mostrar información sobre los procesos en ejecución en el sistema para ese instante.
ps
PID | TTY | TIME | CMD |
6391 | ? | 00:00:00 | bash |
6392 | ? | 00:00:00 | ps |
Con la opción -e
o -A
(“all processes” o “todos los procesos”) podemos ver todos los procesos del sistema
ps -e | head -2
PID | TTY | TIME | CMD |
1 | ? | 00:00:00 | init |
Con la opción aux
podemos ver todos los procesos con detalles adicionales, incluyendo procesos no asociados con una terminal.
ps aux | head -2
USER | PID | %CPU | %MEM | VSZ | RSS | TTY | STAT | START | TIME | COMMAND | |
root | 1 | 0.0 | 0.0 | 2512 | 1664 | ? | Ss | 18:02 | 0:00 | init | [3] |
Es una combinación de los indicadores:
a
, que muestra todos los procesos asociados con cualquier terminalu
, que muestra informacion detallada sobre los procesos, incluyendo el nombre del usuario propietariox
, que muestra procesos que no están asociados con ninguna terminal
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
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.
Para ver los tipos de señales disponibles se puede utilizar la opción -l
del comando.
kill -l
1) SIGHUP | 2) SIGINT | 3) SIGQUIT | 4) SIGILL | 5) SIGTRAP |
6) SIGABRT | 7) SIGBUS | 8) SIGFPE | 9) SIGKILL | 10) SIGUSR1 |
11) SIGSEGV | 12) SIGUSR2 | 13) SIGPIPE | 14) SIGALRM | 15) SIGTERM |
16) SIGSTKFLT | 17) SIGCHLD | 18) SIGCONT | 19) SIGSTOP | 20) SIGTSTP |
21) SIGTTIN | 22) SIGTTOU | 23) SIGURG | 24) SIGXCPU | 25) SIGXFSZ |
26) SIGVTALRM | 27) SIGPROF | 28) SIGWINCH | 29) SIGIO | 30) SIGPWR |
31) SIGSYS | 34) SIGRTMIN | 35) SIGRTMIN+1 | 36) SIGRTMIN+2 | 37) SIGRTMIN+3 |
38) SIGRTMIN+4 | 39) SIGRTMIN+5 | 40) SIGRTMIN+6 | 41) SIGRTMIN+7 | 42) SIGRTMIN+8 |
43) SIGRTMIN+9 | 44) SIGRTMIN+10 | 45) SIGRTMIN+11 | 46) SIGRTMIN+12 | 47) SIGRTMIN+13 |
48) SIGRTMIN+14 | 49) SIGRTMIN+15 | 50) SIGRTMAX-14 | 51) SIGRTMAX-13 | 52) SIGRTMAX-12 |
53) SIGRTMAX-11 | 54) SIGRTMAX-10 | 55) SIGRTMAX-9 | 56) SIGRTMAX-8 | 57) SIGRTMAX-7 |
58) SIGRTMAX-6 | 59) SIGRTMAX-5 | 60) SIGRTMAX-4 | 61) SIGRTMAX-3 | 62) SIGRTMAX-2 |
63) SIGRTMAX-1 | 64) 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
)
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
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
.
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.
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
PID | NI | CMD | |
32438 | 0 | sleep | 10 |
32468 | 10 | sleep | 10 |
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
.
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.
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.
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
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.
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
vi &
[1] 11585
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
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 &
Con la opción -s
podemos ver los procesos que se encuentran en estado suspendido (Stopped
).
jobs -s
[1]+ Stopped vi
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.
Lanzamos un proceso:
vi &
[1] 14720
Para traerlo de vuelta a primer plano:
fg %1
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.
Lanzamos un proceso:
vi &
[1] 15050
Para traerlo de vuelta a primer plano:
bg %1
[1]+ vi &
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.
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 medianochenoon
para el mediodíateatime
que es equivalente a las4 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íaM
por el mesC
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 minutoshours
para las horasdays
para los díasweeks
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 ahoratoday
para hoytomorrow
para mañana
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
El comando atq
(”at
queue” o “cola de at
”) se usa para ver las tareas programadas con el comando at
:
atq
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
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.
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.
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