Esta página puede ser redistribuida libremente bajo los términos de la licencia GPL. Vease ( GPL texto original ) o si lo prefiere (Traducción española no oficial de la GPL) Al margen de las obligaciones legales que se derivan del uso de esta licencia rogamos sea respetada la referencia a su lugar de publicación original www.ciberdroide.com. y a su autor original Antonio Castro Snurmacher (Madrid 01/01/2000). |
![]() |
Esta ausencia de garantía se hace extensa a cualquier tipo de uso de este material y muy especialmente a las prácticas, ejercicios, y de ejemplos que encuentre en estas páginas. Deberá trabajar siempre salvo indicación contraria con un SO Linux y con un usario distinto de 'root' sin privilegios especiales. Como directorio de trabajo se procurará usar el directorio '/tmp' o algún otro que no contenga información valiosa. Tampoco se considera buena idea practicar en una máquina que contenga información valiosa. Todo esto son recomendaciones de prudencia. En cualquier caso si algo sale mal toda la responsabilidad será únicamente suya. En ningún caso podrá reclamar a nadie por daños y perjuicios derivados del uso de este material. Para más información lea el contenido de la licencia GPL y abstengase de hacer prácticas si no está dispuesto a asumir toda la responsabilidad.
|
PID | Es el valor númerico que idenfica al proceso. |
TTY | Es el terminal asociado a ese proceso. Los demonios del sistema no tienen ningún terminal asociado y en este campo figurará un ? |
STAT | Tiene tres campos que indican el estado del proceso (R,S,D,T,Z) (W) (N) La S indica que el proceso está suspendido esperando la liberación de un recurso (CPU, Entrada Salida, etc) necesario para continuar. Explicaremos solo algunos de estos estados en su momento. |
TIME | Indica el tiempo de CPU que lleva consumido ese proceso desde que fué arrancado. |
COMMAND | Muestra el comando y los argumentos que le fueron comunicados. |
Existen muchas opciones para el comando ps que ofrecen un formato distinto. Le recomendamos especialmente que pruebe 'ps u', 'ps l', y 'ps f'
En Unix los comandos suelen servir para una sola cosa, aunque suelen tener muchas opciones. La entrada de los comandos suele tener una estructura simple y la salida de los comandos tambíen. Si un comando no encuentra nada que hacer existe la costumbre de que termine de modo silencioso. Todo esto permite que los comandos puedan combinarse enganchado la salida de uno con la entrada de otro. Algunos comandos están especialmente diseñados para ser usados de esta forma y se les suele denominar filtros.
La salida del comando 'ps' se puede filtrar con 'grep' para que muestre solo las líneas que nos interesan.
Configuración del terminal
No pretendemos ahora exiplicar los términales de Linux pero si queremos
que compruebe su capacidad para interrumpir procesos con <Ctrl-C> ya que
usaremos esto en las prácticas que siguen. Una prueba inofensiva para
comprobar la interrupcion de un proceso es el siguiente comando que provoca
una espera de un minuto. Deberá introducir el comando e interrumpirlo antes
de que el tiempo establecido (60 segundos se agote).
Si no ha conseguido interrumpir el proceso no siga adelante para evitar
que alguna de las prácticas deje un proceso demasiado tiempo consumiendo
recursos de su máquina. Si esta usted solo en la máquina eso tampoco
tendría mucha importancia pero es mejor que averigue la forma de interrumpir
el proceso del ejemplo anterior.
Comando time
La mayoría de los comandos están gran parte del tiempo sin consumir CPU
porque necesitan esperar para hacer entrada salida sobre dispositivos
lentos que además pueden estar en uso compartidos por otros procesos.
Existe un comando capaz de esperar tiempo sin gastar tiempo de CPU.
Se trata del comando 'sleep'. Para usarlo le pasaremos un argumento que
indique el número de segundos de dicha espera.
Por ejemplo vamos a comprobar cuanta CPU consume una espera
de 6 segundos usando sleep
El resultado obtenido puede variar ligeramente en cada sistema pero
básicamente obtendrá un tiempo 'real' de unos 6 segundos y un tiempo de
CPU ( 'user' + 'sys' ) muy pequeño.
Vamos a medir tiempos en un comando que realice operaciones de entrada
salida así como proceso de datos.
En este comando verá que el consumo total de CPU es superior al del
comando sleep. En cualquier caso el tiempo real tardado en la ejecución
del comando es siempre muy superior al consumo de CPU.
Vamos a probar un comando que apenas realice otra cosa que
entrada salida. Vamos a enviar 10Mbytes al dispositivo /dev/null.
Existe un comando 'yes' que provoca la salida continua de un caracter
'y' seguido de un caracter retorno de carro. Esta pensado para sustituir
la entrada de un comando interactivo en el cual queremos contestar
afirmativamente a todo lo que pregunte. Nosotros fitraremos la salida
de 'yes' con el comando 'head' para obtener solo los 10Mbytes primeros
producidos por 'yes' y los enviaremos al dispositivo nulo '/dev/null'
que viene a ser un pozo sin fondo en el cual podemos introducir cualquier
cosa sin que se llene, pero no podremos sacar absolutamente nada. En una
palabra vamos a provocar proceso de entrada salida perfectamente inutil.
Podemos hacer un consumo fuerte de CPU si forzamos a cálculos masivos
que no tengan apenas entrada salida. Por ejemplo podemos poner a
calcular el número PI con 300 cifras decimales. 'bc' es un comando
que consiste en una calculadora. Admite uso interactivo pero tambien
acepta que le pasemos las operaciones desde otro proceso combinando
entrada salida.
En un Pentium 200Mhz este comando tardó 3 segundos para 300 cifras y 20
segundos usando 600 cifras. Decimos esto para que vea que el tiempo
que se tarda aumenta exponencialmente y que dependiendo de la potencia
de su ordenador puede suponer bastante tiempo de proceso. Quizas tenga
que variar el número de cifras significativas para poder medir tiempos
con comodidad.
Este comando 'time' es un comando interno pero en Linux también hay
un comando externo llamado de la misma forma. Para poder ejecutarlo
con esta shell debería incluir el camino completo. No deseamos abusar
de su escaso 'time' así que no lo comentaremos. Para buscar en el
man el comando 'time' que hemos explicado o de cualquier otro comando
interno tendría que mirar en la página del manual de bash.
Comando kill
Un proceso unix puede
capturar cualquier señal excepto la señal 9. Una vez capturada la
señal se puede activar una rutina que puede programarse con toda libertad
para realizar cualquier cosa.
'kill' por defecto es 'kill -15' envia un SIGTERM y generalmente provoca
cierre
ordenado de los recursos en uso. Esta señal puede ser ignorada, o puede
ser utilizada como un aviso para terminar ordenadamente. Para matar un
proceso resulta
recomendable enviar primero un kill -15 y si no se consigue nada repetir con
kill -9. Este último -9 envia SIGKILL que no puede ser ignorada, y termina
inmediatamente. Solo fallara si no tenemos permisos para matar ese proceso,
pero si es un proceso nuestro, kill -9 resulta una opción segura para
finalizar un proceso.
Las señales actuan frecuentemente como avisos de que ha ocurrido algo.
Existen muchos tipos de señales para poder distinguir entre distintas
categorías de incidencias posibles.
Comando nice
Existen dos numeros de prioridad. La prioridad NICE y la
prioridad concedida por el Kernel mediante un algoritmo. Esta
última no tiene porque coincidir con nice y puede valer mas de
39. En cambio el comando nice solo acepta valores comprendidos
entre 0 y 39, siendo 20 el valor por defecto. Cuando nice sube
el valor significa que el proceso tiene baja prioridad.
El comando 'nice -10' incrementara el valor nice en 10 (es decir
baja la prioridad). Para bajar el valor de nice (Es decir para
subir la prioridad) hace falta permisos de superusuario.
En un sistema con poca carga de trabajo no se notará apenas
diferencia al ejecutar un comando con baja prioridad o con
alta prioridad. Pero en un sistema con la CPU sobrecargada
los comandos ejecutados con prioridad más baja se veran retrasados.
ya que el kernel concederá más tiempo de CPU a los procesos con
prioridad más alta.
Hay otros comandos de interés. Por ejemplo 'top' muestra los
procesos que mas CPU estén consumiendo. 'vmstat' saca
información del consumo de memoria virtual.
Hay que tener en cuenta que el sistema gasta recursos en la
gestión de los procesos. Por ejemplo si estamos compartiendo
una máquina con otros usuarios y tenemos que realizar 15
compilaciones importantes terminaremos antes haciendolas en
secuencia una detras de otra que lanzandolas todas a la vez.
La avaricia de querer usar toda la CPU posible para nosotros
puede conducir a una situación en la cual ni nosotros ni nadie
sacará gran provecho de la CPU. El sistema realizará una cantidad
enorme de trabajo improductivo destinado a mantener simultanemente
funcionando una gran cantidad de procesos que gastan mucha CPU y
mucha memoria. La máquina comienza a usar el disco duro para suplir
la falta de RAM y comienza a gastar casi todo el tiempo en el
intercambio de la RAM con el disco duro. A esta situación se
la denomina swaping.
Comando renice
Test
Conviene que comprobemos si su terminal está correctamente configurado
para poder interrumpir un proceso. Normalmente se usa <Ctrl-C> pero
esto depende de la configuración de su terminal.
Si en algún momento su terminal queda desconfigurado haciendo cosas
raras como por ejemplo mostrar caracteres extraños intente recuperar
la situación tecleando el comando 'reset'. Esto solo es válido para
Linux. Para otros sistemas puede ser util 'stty sane' que también
funciona en Linux pero no es tan eficaz como el comando 'reset'.
Para comprobar la configuración de su terminal puede hacer 'stty -a'
aunque obtendrá demasiada información que no es capaz de interpretar,
podemos indicarle que se fije en el valor de 'intr'. Debería venir
como 'intr = ^C'. Si no lo localiza haga 'stty -a | grep intr'.
De esta forma solo obtendrá una linea. Para configurar el terminal
de forma que pueda interrumpir procesos con <Ctrl-C> puede intentar
configurar su terminal haciendo 'stty ^V^C'. El carácter <Ctrl-V>
no se mostrará en el terminal ya que actua evitando que el siguiente
carater (<Ctrl-C> en nuestro caso) no sea interpretado como caracter
de control.
$ sleep 60
<Ctrl-C>
Da los tiempos de ejecucion. Este comando nos da tres valores
cuya interpretacion es:
real Tiempo real gastado (Duración real)
user Tiempo CPU de usuario.
sys. Tiempo CPU consumido como proceso de kernel.
(Es decir dentro de las llamadas al kernel)
$ time sleep 6
real 0m6.021s
user 0m0.020s
sys 0m0.000s
$ time ls /* > /dev/null
real 0m0.099s
user 0m0.080s
sys 0m0.010s
$ time yes | head --bytes=10000000 > /dev/null
Tubería rota
real 0m6.478s
user 0m5.440s
sys 0m0.900s
$ time ( echo "scale=300; 4*a(1)" | bc -l )
3.141592653589793238462643383279502884197169399375105820974944592307\
81640628620899862803482534211706798214808651328230664709384460955058\
22317253594081284811174502841027019385211055596446229489549303819644\
28810975665933446128475648233786783165271201909145648566923460348610\
454326648213393607260249141272
real 0m2.528s
user 0m2.520s
sys 0m0.010s
Este comando se utiliza para matar procesos. En realidad envia señales a
otros procesos, pero la acción por defecto asociada a la mayoria de las
señales de unix es la de finalizar el proceso. La finalización de un
proceso puede venir acompañada del volcado de la información del proceso
en disco. Se genera un fichero 'core' en el directorio actual que solo
sirve para que los programadores localicen el fallo que provocó esta
prusca finalización del proceso. Por ejemplo si el proceso intenta acceder
fuera del espacio de memoria concedido por el kernel, recibirá una señal
que lo matará. Lo mismo ocurrirá si se produce una división por cero o
algún otro tipo de error irrecuperable.
El multiproceso esta implementado concediendo ciclicamente
la CPU en rodajas de tiempo a cada proceso que esta en ejecución.
Sirve para cambiar la prioridad de un proceso. Sigue la misma
filosofia que el comando nice pero hay que identificar el o
los procesos que deseamos cambiar su prioridad. Se puede cambiar
la prioridad de un proceso concreto dado su PID o los procesos de
un usuario dando su UID o todos los procesos pertenecientes a un
determinado grupo. dando su GID. Tanto el comando nice como el comando
'renice' tienen mayor interés para un administrador de sistemas que
para un usuario normal. Consulte las páginas del manual para más
detalles.
Puede comprobar sus conocimientos respondiendo el siguiente test.
Para ello seleccione las opciones que se ajusten a la verdad y luego
pulse el boton para ver el resultado de su test.
Si quiere hacernos llegar alguna duda, aclaración,
crítica, o contribución personal, utilice nuestro
formulario de contacto y nosotros le contestaremos