Administración de procesos
Lista de procesos
La instrucción ps (process status) permite obtener información sobre los procesos en curso. Si se ejecuta solo, visualiza únicamente los procesos en curso iniciados por el usuario y desde la consola actual.
ps
PID TTY TIME CMD
13350 pts/1 00:00:00 bash
21701 pts/1 00:00:00 ps
al escribir ps con las banderas de -f y -e nos ampliará la información de cada proceso y al mismo tiempo nos mostrará todos los procesos en curso
ps -fe
UID PID PPID C STIME TTY TIME CMD
...
root 1252 1 0 nov30 ? 00:00:02 /usr/lib/upower/upowerd
Debian-+ 1292 1 0 nov30 ? 00:00:00 /usr/bin/pulseaudio --start --lo
rtkit 1293 1 0 nov30 ? 00:00:01 /usr/lib/rtkit/rtkit-daemon
root 1303 2 0 nov30 ? 00:00:00 [krfcommd]
Debian-+ 1315 1153 0 nov30 tty7 00:00:03 /usr/lib/gnome-settings-daemon/g
root 1316 1 0 nov30 ? 00:07:59 /usr/lib/packagekit/packagekitd
colord 1341 1 0 nov30 ? 00:00:00 /usr/lib/colord/colord
dnay 1363 1 0 nov30 ? 00:00:00 /lib/systemd/systemd --user
dnay 1364 1363 0 nov30 ? 00:00:00 (sd-pam)
...
El parámetro -u permite precisar una lista de uno o varios usuarios separados por una coma. El parámetro -g efectúa lo mismo pero para los grupos, -t para los terminales y -p para unos PID determinados.
ps -u root
PID TTY TIME CMD
1 ? 00:00:05 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:03 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
7 ? 00:01:39 rcu_sched
8 ? 00:00:00 rcu_bh
9 ? 00:00:00 migration/0
10 ? 00:00:00 watchdog/0
11 ? 00:00:00 watchdog/1
Finalmente el parámetro -l ofrece más información técnica.
ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 13350 1744 0 80 0 - 5879 - pts/1 00:00:00 bash
0 R 1000 21837 13350 0 80 0 - 6851 - pts/1 00:00:00 ps
Estas son algunas de las columnas que muestra la instrucción ps en sus diferentes banderas:
Columna | Definición |
---|---|
UID | User ID, identificador de usuario |
PID | Process ID, identificador del proceso |
PPID | Parent Process ID, identificador del proceso padre |
C | Factor de prioridad, entre más elevado sea el número, mayor será su prioridad |
STIME | Hora de inicio del proceso |
TTY | Nombre de la terminal desde la cual se ejecutó el proceso |
TIME | Duración del proceso |
CMD | Instrucción ejecutada |
S | Estado del proceso S (sleep), R (Running) y Z (Zombie) |
PRI | Prioridad del proceso |
NI | Nice* se verá más adelante. |
Es importante mencionar que se puede hacer uso de pipes para obtener la información de un proceso, con la siguiente sintaxis:
ps aux | grep
<nombre del proceso>
Ejemplo:
ps aux | grep ssh
dnay 1432 0.0 0.0 11116 328 ? Ss nov30 0:00 /usr/bin/ssh-agent x-session-manager
dnay 21867 0.0 0.0 12748 2148 pts/1 S+ 14:35 0:00 grep ssh
Señales en los procesos
Es posible detener un proceso en primer plano con la combinación de teclas [Ctrl] Z. Cuando un proceso se ejecuta en segundo plano, no lo puede parar cualquier combinación de teclas, al menos que se utilice el gestor de jobs con fg y bg. Para ello es necesario mandarle señales especiales a ese proceso en segundo plano.
La instrucción kill manda señales a los procesos, no necesariamente los termina/mata como pudiese parecer.
kill
[-l] -señal PID [PID2...]
Las señales es una de las formas en la que podemos comunicarnos con los procesos, los cuales la interceptarán y reaccionarán. Se pueden ignorar algunas señales, pero otras no. Según los Unix, se dispone de un número más o menos importante de señales. Se numeran y nombran las señales, pero cuidado: si bien los nombres suelen ser comunes de un Unix a otro, los números no lo son obligatoriamente. Podemos listar las señales con la instrucción kill -l:
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
La señal más empleada es la 9, SIGKILL ya que no puede ignorarse forzando al proceso a finalizar no importando lo que suceda.
sleep 100&
[1] 22398
kill 22398
[1]+ Terminado sleep 100
sleep 100&
[1] 22408
kill -9 22408
[1]+ Terminado (killed) sleep 100
Para eliminar procesos zombies (programa que ha finalizado sus tareas pero sigue en ejecución) se puede hacer uso del siguiente comando, el cual obtiene una variable que es resultado del uso de dos comandos.
kill $(ps -A -o stat,ppid|awk '/[zZ]/{print $2}')
ps usa -A para mostrar todos los procesos y -o acepta como argumentos: user, group, comm, args, pid, ppid, pgid, etime, nice, rgroup, ruser, time, tty, vsz, sid, stat, rss.
awk busca el stat con resultado zZ e imprime su proceso de identificación.
El resultado se da como variable al comando kill.
Nice y renice
La instrucción nice permite iniciar un comando con una prioridad más baja para permitir a otros posibles procesos ejecutarse más rápidamente.
nice
[-valor] instrucción [argumentos]
Un valor positivo causará una bajada de prioridad; uno negativo, el aumento de la prioridad (si está autorizado). El valor debe estar comprendido entre -20 y 20. Cuanto más elevado es el valor, menor es la prioridad.
nice -10 ls -1R / >lista 2>/dev/null &
[1] 23872
ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 13350 1744 0 80 0 - 5922 - pts/1 00:00:00 bash
0 R 1000 23874 13350 0 80 0 - 6851 - pts/1 00:00:00 ps [1]+ Salida 1 nice -10 ls -1R / > lista 2> /dev/null
El comando renice funciona un poco como nice, pero permite modificar la prioridad en función de un usuario, un grupo o un PID. El proceso debe estar ya ejecutándose.
renice
[-n prio] [-p] [-g] [-u] ID
La prioridad debe estar entre 20 y 20. El usuario estándar sólo puede utilizar los valores entre 0 y 20 que permiten bajar la prioridad. La opción -p precisa un PID, -g un GID y -u un UID.
Uso de top
Si bien ps y sus diversas banderas nos permiten conocer los procesos que tiene el usuario o el sistema en general tienen la desventaja de que se muestran de forma estática y no permite hacer un seguimiento dinámico de lo que sucede con los procesos en tiempo real. Para solventar ese problema contamos con la instrucción top que nos permiten saber el estado en tiempo real del sistema, los procesos y algunos detalles más.
Su sintaxis es muy sencilla:
top
Y desplegará sobre la terminal una interfaz en modo texto que se va a ir actualizando cada 3 segundos. Con el resumen del estado del sistema y la lista de procesos que se están ejecutando:
Tiempo de actividad
En la primera línea vemos:
top - 17:01:04 up 3 days, 7:21, 1 user, load average: 0.06, 0.74, 1.00
En donde se muestra
- Hora actual.
- Tiempo que ha estado el sistema encendido.
- Número de usuarios
- Carga media en intervalos de 5, 10 y 15 minutos respectivamente.
practicamentes es lo mismo que la instrucción uptime.
Tareas
La segunda línea muestra el total de tareas y procesos, los cuales pueden estar en diferentes estados.
Tasks: 242 total, 1 running, 241 sleeping, 0 stopped, 0 zombie
- Running (ejecución): procesos ejecutándose actualmente o preparados para ejecutarse.
- Sleeping (hibernación): procesos dormidos esperando que ocurra algo (depende del proceso) para ejecutarse.
- Stopped (detenido): ejecución de proceso detenida.
- Zombie el proceso no está siendo ejecutado. Estos procesos se quedan en este estado cuando el proceso que los ha iniciado muere (padre).
Estado del procesador
%Cpu(s): 9.6 us, 3.0 sy, 0.0 ni, 87.3 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
Nos muestra los porcentajes de uso del procesador.
- us (user, usuario): tiempo de CPU de usuario.
- sy (system, sistema): tiempo de CPU del kernel.
- id (idle, inactivo): tiempo de CPU en procesos inactivos.
- wa (wating, en espera): tiempo de CPU en procesos en espera.
- hi (harware interruption, interrupciones de hardware): interrupciones de hardware.
- si (software interruption, interrupciones de software): tiempo de CPU en interrupciones de software.
Memoria física
KiB Mem : 7876288 total, 73988 free, 3681088 used, 4121212 buff/cache
- Memoria total.
- Memoria disponible.
- Memoria empleada.
- Memoria empleada por el búffer.
- Memoria virtual
KiB Swap: 8081404 total, 7974948 free, 106456 used. 3615516 avail Mem
- Memoria total.
- Memoria usada.
- Memoria libre.
- Memoria en caché.
Columnas
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- PID: es el identificador de proceso. Cada proceso tiene un identificador único.
- USER: (USUARIO): usuario propietario del proceso.
- PR: prioridad del proceso. Si pone RT es que se está ejecutando en tiempo real.
- NI: asigna la prioridad. Si tiene un valor bajo (hasta -20) quiere decir que tiene más prioridad que otro con valor alto (hasta 19).
- VIRT: cantidad de memoria virtual utilizada por el proceso.
- RES: cantidad de memoria RAM física que utiliza el proceso.
- SHR: memoria compartida.
- S (ESTADO): estado del proceso.
- %CPU: porcentaje de CPU utilizado desde la última actualización.
- %MEM: porcentaje de memoria física utilizada por el proceso desde la última actualización.
- TIME+ (HORA+): tiempo total de CPU que ha usado el proceso desde su inicio.
- COMMAND: comando utilizado para iniciar el proceso.
Al presionar la tecla c, top nos mostrará la ruta absoluta de cada proceso en ejecución
Es posible cambiar el tiempo de actualización de la interfaz, presionando la tecla d seguido del tiempo de refresco en segundos.
Terminar un proceso
Con presionar k, nos pedirá el PID de proceso que deseemos terminar.
Renice
Presionando r, seguido del número del PID.
Para salir solo basta presionar q
Video: Ejemplo sobre Procesos
Uso de ps, kill y top