El primer mandato interesante es ps (process status). Su sintaxis, con sus opciones más importantes son:
ps
| Muestra los proceso activos del usuario en la sesión en la que se ejecuta el mandato ps. |
ps -f
| Idem del anterior pero expandiendo la información y mostrando cada mandato completo (full). |
ps -u usuario
| Muestra todos los procesos de un usuario. |
ps -e
| Muestra todos los procesos del sistema entero. |
ps -l
| Idem de ps mostrando toda la información de los procesos. |
Las opciones anteriores se pueden combinar, y el resultado es una tabla donde los principales descriptores, en virtud de las opciones de ps, son los son los siguientes:
S
|
Estado del proceso:
0 ![]() R ![]() S ![]() T ![]() Z ![]() |
UID
| Número de identificación de usuario. |
PID
| Número de identificación de proceso. |
PPID
| Número de identificación del proceso padre. |
PRI
| Número que indica en qué medida puede bajarse la prioridad de un proceso. |
TTY
| Terminal al que está asociado el proceso. |
CMD
| El mandato que lanzó el proceso. |
El PID resulta muy útil para averiguar la relación de parentesco entre procesos. Supongamos la siguiente secuencia de operaciones:
acroread raiz.pdf &
vim s5.tex
:sh
ps -fl | more
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD 000 S perico 709 707 0 60 0 - 439 wait4 09:44 pts/1 00:00:00 -bash 000 S perico 869 709 0 60 0 - 1457 do_sel 10:42 pts/1 00:00:02 acroread r.pdf 000 S perico 944 709 0 60 0 - 1215 wait4 11:00 pts/1 00:00:00 vim s5.tex 000 S perico 945 944 0 77 0 - 450 wait4 11:00 pts/1 00:00:00 /bin/bash 000 R perico 1252 945 0 77 0 - 629 - 15:52 pts/1 00:00:00 ps -fl 000 S perico 1253 945 0 77 0 - 280 pipe_r 15:52 pts/1 00:00:00 more |
Apartir de los datos sobre PID y PPID sabemos que los procesos
están emparentados según el gráfico de la figura .
Además podemos ver en la columna S que salvo el proceso ps -fl, que está listo para ejecución, todos los procesos están a la espera de una señal. La prioridad (PRI) es mayor en los tres últimos procesos. La bondad de cada proceso (NI) es 0.7.2
Otro mandato interesante para analizar el tiempo invertido en un mandato es
time mandato
| Muestra el tiempo invertido al procesar un mandato. |
Específicamente muestra:
Uno de los mandatos menos utilizados suele ser nice, que sirve para que nuestros procesos en trasfondo dejen sitio, cuando sea necesario, a otros procesos que consumen más recursos. Éstos últimos usualmente son procesos interactivos y con fuerte componente de entrada/salida.
nice mandato
| Disminuye la demanda de prioridad para el mandato indicado. |
Por ejemplo, podemos mandar un proceso costoso en tiempo de ejecución, para que se ejecute en background y que se descuelgue de la sesión si ésta finaliza en algún momento.
nohup nice proceso-costoso &
|
Finalmente hay que hacer hueco a uno de los mandatos más utilizados en el entorno de un estudiante de UNIX: kill. Este mandato sirve para enviar «señales» a un proceso. Estas señales disparan en dicho proceso rutinas de tratamiento de señales, y son programables por el desarrollador de aplicaciones. Algunas de ellas tienen un cometido muy concreto, y entre éstas las más utilizadas son:
SIGHUP
| (1) Hangup - por defecto provoca: exit. (ver termio). |
SIGINT
| (2) Interrupt - por defecto provoca: exit. (ver termio). |
SIGQUIT
| (3) Quit - por defecto provoca: core. (ver termio). |
SIGABRT
| (6) Abort - por defecto provoca: core. |
SIGKILL
| (9) Killed - por defecto provoca: exit. |
SIGTERM
| (15) Terminated - por defecto provoca: exit. |
SIGSTOP
| (23) Stopped - por defecto provoca: stop. |
Aproximadamente desde la señal 1 a la 15 son estándar. Apartír de ahí, dependen del sistema. Para ver una lista completa recomiendo utilizar la página de manual signal, tanto en el manual 2, como en el manual 3HEAD para Solaris o 7 para Linux.
kill -l
| Muestra una lista de señales disponibles. |
kill #-PID
| Envía una señal de terminación SIGTERM al proceso identificado con el PID #-PID. |
kill - sig #-PID
| Envía una señal de número sig al proceso identificado con el PID #-PID. |
kill - sig % #
| Igual que el anterior, pero cuando identificamos el proceso mediante el mandato jobs. |
En algunas versiones de UNIX, el número de señal se precede con la opción -s.
Un uso habitual de kill es acabar con procesos colgados que aparecen cuando por alguna razón se interrumpen anormalmente sus canales de entrada/salida y no podemos hacerlos terminar de forma natural. Por ejemplo, si se pierde la conexión de una sesión, a menudo el proceso shell sigue ejecutándose aunque no podamos interactuar con él. Cuando volvemos a entrar en el sistema, al ejecutar
ps -fu pedro
| Si somos el usuario pedro, miramos los procesos que nos corresponden. |
podríamos ver una lista como la siguiente:
UID PID PPID C STIME TTY TIME CMD pedro 18547 18545 0 11:29:12 pts/22 0:00 -bash pedro 18571 18547 0 11:29:12 pts/22 0:00 vi texto.txt pedro 18600 18593 0 11:29:12 pts/22 0:00 -bash |
donde el proceso 18600 corresponde con nuestra sesión actual7.3, y sabemos de buena tinta que el resto de los procesos se corresponde con una sesión anterior. Matémoslos:
kill 18547
| Terminamos (SIGTERM) con el proceso padre de los que están colgados. |
Normalmente con ésto conseguimos que este proceso acabe con el resto de sus hijos al enviarles una señal de terminación, pero a veces no es suficiente, e incluso hay procesos un poco rebeldes. Para ellos reservamos la señal más mortífera:
kill -s 9 18571
| Enviamos una señal KILL al proceso 18571. |
El problema es que con esta señal a veces no conseguirmos liberar los recursos empleados por el proceso (buffers de entrada/salida, archivos de bloqueo,...) con lo que debemos realizar una limpieza posterior.