Sistemas
Operativos
Ciclo 02/2012
Nombre: Walter
Mauricio Alfaro Rugamas
Fecha: 22/09/2012
PRÁCTICA
GESTIÓN DE PROCESOS Y TAREAS
1.
Inicia Ubuntu. Desde
la línea de mandatos, lee la página del manual sobre
el mandato ps. Ejecuta ps y visualiza los procesos que se están
ejecutando en este momento. El primer valor que aparece es el
identificador de proceso (PID). El segundo es la terminal que está asociada
a ese proceso. Después también podemos observar el tiempo acumulado de uso
de CPU, y finalmente el nombre del programa que ha dado lugar a este
proceso. Apunta los procesos activos
y sus valores.
2. Por defecto, ps sólo ha mostrado los procesos asociados con la misma
terminal e iniciados por el mismo usuario. Vamos a recuperar
las opciones que nos permiten mostrar todos los procesos. Ejecuta el mandato “ps
-e”. Comprueba la lista de procesos que están corriendo en tu máquina. ¿Cuál lleva el PID igual a 1?
Lo lleva init
¿Qué procesos se están ejecutando en las terminales tty1, tty2…tty6?
Tt1=getty
Tt2=getty
Tt3=getty
Tt4=getty
Tt5=getty
Tt6=getty
Recuerda lo que sucedía al pulsar “Ctrl + Alt + F1” hasta “Ctrl + Alt + F6”;
comprueba el nombre de cada una de esas terminales. Vuelve a la terminal en que se encuentra
el entorno gráfico (Ctrl + Alt + F7). ¿Qué proceso está corriendo sobre tty7?
Tt7=Xorg
3. El mandato ps todavía nos puede ofrecer más información sobre los procesos en ejecución.
Por ejemplo,
¿quién ha iniciado cada uno de los procesos en nuestra máquina? Vamos a usar las siguientes opciones
del mandato ps: “a” nos permite conocer
todos los procesos que tienen una
terminal asociada; “x” aquellos que no tienen terminal;
la opción “u” nos muestra la salida en un formato
más legible. Teclea el mandato “ps aux”.
Observa en las cabeceras la información que has obtenido
de cada proceso. Busca por
medio de “man
ps”
o
en http://unixhelp.ed.ac.uk/CGI/man- cgi?ps el significado de
aquellas columnas que desconozcas y apúntalo en tu
informe (por ejemplo, RSS, VSZ). Busca también en el manual de “ps” (en la sección dedicada
a la descripción del campo “STAT”) o en el anterior
enlace en la sección “PROCESS STATE
CODES” y apunta en tu informe el significado del status de cada uno de los procesos que están en ejecución.
TTY= Terminal asociada al proceso,
si no hay terminal aparece entonces un '?'
RSS= Resident Sise, tamaño de la
parte residente en memoria en kilobytes
VSZ Tamaño de la memoria virtual
(espacio de direcciones asignado).
STAT= Status del proceso, estos pueden ser
los siguientes
Ø R
runnable, en ejecución, corriendo o ejecutándose
Ø S
sleeping, proceso en ejecución pero sin actividad por el momento, o esperando
por algún evento para continuar
Ø T sTopped,
proceso detenido totalmente, pero puede ser reiniciado
4. Todos los mandatos
y opciones que
hemos visto hasta ahora ofrecían
información estática sobre los procesos. Esta información se extrae del
directorio “/proc” del sistema. Hay algunas aplicaciones que también nos permiten conocer en
tiempo real las
características de cada proceso.
Ejecuta el mandato man top. ¿Qué hace el mandato top? Ejecuta el mismo.
Ofrece un
programa dinámico de visión en tiempo real de un sistema en funcionamiento. Puede mostrar sistema información
resumida así como una lista de tareas que actualmente se gestiona el kernel.
Como puedes observar, la información
sobre el sistema se refresca cada 3 segundos (se puede modificar ese parámetro).
Por lo demás, la interfaz de usuario
de top no es especialmente
agradable, aunque sí resulta sencillo modificar ciertas opciones y ajustarla
a nuestros requisitos. Pulsa “q” para salir
de top.
5. Ejecuta ahora el mandato “top –u alumno”. ¿Cómo ha
cambiado la salida del
mandato? ¿A quién pertenecen los procesos que observas ahora?
6. Vuelve a ejecutar
top. Apunta el PID del proceso Xorg. Dirígete
a la carpeta “/proc”. Ejecuta ls. ¿A quién pertenecen los distintos directorios presentes en el mismo? Busca
el directorio cuyo nombre coincida
con el PID de Xorg. Muévete
a ese directorio.
Lista el contenido del mismo.
PID
931 de Xorg
931
vmallocimfo
Puedes leer en http://es.wikipedia.org/wiki/Procfs algunas de las peculiaridades del directorio “/proc”. Apunta algunas de sus principales características; en particular, por qué no ocupa espacio del disco duro y qué sistemas operativos, incluido Linux, hacen uso de un directorio como éste.
PROC es la abreviatura de sistema de
ficheros de procesos, un pseudo sistema de ficheros que se utiliza para
permitir el acceso a la información del kernel sobre los procesos. Dado que PROC no es un sistema de ficheros real, no
consume ningún espacio de almacenamiento, y sólo consume una limitada cantidad
de memoria
7. Observa en el enlace http://en.wikipedia.org/wiki/Procfs#Linux algunos de los ficheros y directorios
más importantes que hay en la carpeta en que
te encuentras, y para qué son usados.
Comprueba el tipo de archivo (por medio de “file”) que son “limits”
y “status”. ¿Es coherente con lo que leíste en el ejercicio 6? Ahora,
por medio de “less” (y
de “sudo” si fuera necesario), muestra el contenido de “limits”
y “status”. Apunta en tu informe de prácticas
alguno de los datos que
contienen ¿Qué tipo de información encuentras en los mismos?
Limits= Este archivo muestra el límite bajo, límite alto y unidades de medida para cada uno de los límites de recursos del proceso. El archivo está protegido para permitir sólo la lectura por el UID real del proceso.
Status= Proporciona mucha de la información en / proc / [pid] / stat y / proc / [pid] / status en un formato que es más fácil para los seres humanos para analizar.
Un ejemplo:
$ cat / proc / $ $ / estado
Nombre: bash
Estado: S (sleeping)
TGID: 3515
Pid: 3515
PPID: 3452
TracerPid: 0
En ambos puedo encontrar su estado, su direccionamiento y valor de PID para cada proceso que me indica
8. Vuelve a tu directorio personal (cd $HOME, cd ~, cd /home/alumno, …) Veamos ahora algunos atajos de teclado que nos permiten
gestionar procesos. Comprueba
la función del mandato yes. Aunque el mismo pueda
no parecer de gran utilidad a nosotros nos
va a servir para comprobar cómo podemos detener y “matar” procesos. Ejecuta
el mandato “yes hola”.
Observa que el mensaje aparece indefinidamente.
9. Vamos a “matar” esa tarea. Intenta salir de la tarea con “q”. La tecla “q” (quit, salir) nos permite salir de ciertas aplicaciones en ejecución, pero no
acabar con una tarea. Teclea el atajo “Ctrl + C”. El mismo debería terminar
con el proceso activo. ¿Qué ha sucedido? El atajo de teclado “Ctrl + C” se
encarga de terminar (o matar) una tarea. El atajo “Ctrl + Z” se encarga únicamente de detenerla (aunque el proceso siga “vivo” y se pueda retomar
en el estado en que se detuvo). Finalmente, el atajo “Ctrl + Y” suspende un
proceso hasta que el mismo disponga
de una nueva entrada.
10. Podemos ahora redirigir la salida del mandato
a un fichero (observa que esto podría darnos serios problemas de memoria en nuestra máquina). Para poder redirigir la salida de mandatos
a un
fichero sin peligro
de que eso colapse nuestra memoria, Linux dispone de un fichero cuya localización es
/dev/null.
Comprueba las propiedades de “/dev/null”. Apunta el tipo de fichero que es
(c), sus permisos,
propietario y tamaño.
Es un carácter disponible, que no representa problema para el
kernel, sus permisos son para este ejemplo, solo de root, pero se puede agregar
permisos para otros usuarios, su peso es de 0KB
Es un archivo especial que descarta toda la información que se escribe o Re
direcciona en él. A su vez, no proporciona ningún dato a cualquier proceso que
intente leer de él.
¿Podemos escribir
al mismo? Si podemos escribir
¿Podemos leer su contenido? Si lo podemos leer.
Ejecuta el mandato “yes adios > /dev/null”.
Como puedes observar, la tarea en ejecución no permite seguir utilizando la
terminal. Teclea “Ctrl + C” para detenerlo. ¿Qué
tamaño ocupa ahora en disco
el fichero /dev/null? ¿Dónde ha ido a parar toda la información que
hemos enviado?
Su tamaño es 340 KB, la información se ha ido al archivo plano
null con una cantidad de 211 archivos.
11. Ejecutamos de nuevo el mandato “yes que tal >
/dev/null”.
12. Abre una nueva terminal y localiza el PID del proceso “yes” iniciado.
Puedes usar ps o top. Comprueba la utilidad
del mandato kill. Como puedes
observar, kill nos permite mandar señales a un proceso. El tipo de señales que permite mandar lo puedes encontrar, por ejemplo, en
http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_01.html.
PID= 3359
Lee las Secciones 12.1.1.3 y 12.1.2 del anterior
enlace. Apunta algunas de las señales más comunes que se pueden enviar a procesos en ejecución
y la forma de hacerlo (por teclado, o por medio de kill). Interrumpe el proceso activo
“yes” por medio
del
mandato kill (kill –s 15 PID).
Observa la diferencia entre SIGKILL y SIGTERM.
SIGINT, es una interrupción de
teclado
SIGSTOP, detiene el proceso llamado
SIGKILL, mata la señal del proceso
SIGTERM, terminación total de la señal de proceso
La diferencia entre SIGKILL y SIGTERM, es que el primero solo mata
la señal del proceso, el segundo la elimina totalmente en su ejecución.
13. En nuestra terminal original vuelve a ejecutar el proceso “yes que tal >
/dev/null” y, desde la segunda terminal que hemos abierto, envíale ahora una
señal de SIGKILL. Comprueba que el resultado externo
ha sido el mismo que antes.
La finalización del
proceso es igual.
14. No todos los procesos que ejecutamos en una terminal
deben ejecutarse en primer plano (bloqueando así la terminal). También podemos hacer lo que se conoce como ejecución en segundo plano. Puedes leer en http://www.mastermagazine.info/termino/5040.php información acerca de las principales
diferencias entre ejecutar un proceso en primero o segundo
plano (esencialmente tiene que ver con la prioridad del mismo).
La forma de hacer que un programa se ejecute en segundo plano
es escribiendo el programa
en
el
intérprete de mandatos
seguido
de
un
símbolo &; comprueba, en nuestra terminal original, el siguiente mandato:
$yes otra vez > /dev/null
&
15. Vamos a hacer ahora uso del
mandato jobs. Comprueba en primer
lugar su función por medio de “help jobs”, y el significado
de la opción “-l”. La
diferencia entre un “job” y un “process” es que los “jobs” son obligatoriamente iniciados desde una terminal
y están asociados a ella (son
procesos “hijos”
de la terminal).
Ejecuta el mandato “jobs” en la misma terminal
que has ejecutado “yes”.
¿En qué estado se encuentra el proceso?
Corriendo
Compruébalo también con los mandatos ps y top. Observa el porcentaje de
CPU que consume.
16. Entre los procesos de Linux siempre
existe una jerarquía definida, ya que
cada proceso debe tener un proceso padre (excepto el proceso
de inicio o init).
Esta jerarquía adquiere relevancia ya que “matar”
a un proceso padre por lo general conlleva acabar también con
los procesos hijos. En algunos casos, un proceso padre y sus hijos pueden
incluso compartir
memoria. Comprueba la jerarquía de procesos en tu máquina por medio del
mandato pstree (puedes ver alguna
de sus opciones
en man pstree).
Comprueba sus ancestros. Apunta
en tu
informe de qué procesos desciende “yes”.
Desciende de Konsole- bash- yes
17. Vuelve a ejecutar
yes en la misma terminal
y también en segundo plano
(yes mensaje > /dev/null &). Vuelve a comprobar
el árbol de procesos por medio
de “pstree -h”. Usando
top, anota en tu informe
el porcentaje de CPU (aproximado) que suman estos dos procesos yes.
Aproximado de 95.8% juntos
18. Vuelve a comprobar el estado de
los procesos iniciados en esta
shell por medio de “jobs”. Comprueba
que aparecen las dos tareas iniciadas y que en
la segunda aparece el símbolo + indicando que
es la última que se ha ejecutado. Apunta el estado de ambas
en tu informe.
Su estado es corriendo, ambas.
19. El hecho de que las tareas estén
ejecutándose en segundo plano, impide que les podamos enviar una señal
de teclado (por ejemplo, Ctrl + Z, Ctrl + C). Compruébalo.
A través de “jobs”, cada tarea que se
está ejecutando desde nuestra terminal recibe un nuevo número (1, 2…). Esos números pueden ser usados con
fg (foreground) para traer dichas tareas a primer plano (fg 1, fg 2), o
para mandarlas a segundo
plano (bg 1, bg 2…).
Aplicando en consola, es correcto.
20. Mata la segunda tarea iniciada
(la de mayor PID). Por ejemplo,
puedes ejecutar top y capturar su PID, y enviarle una señal de kill.
Envió un Kill al PID 3740 y es eliminado, en la
segunda consulta de TOP, se verifica.
21. Comprueba por medio de jobs que sólo queda una tarea activa.
Comprobado en tabla anterior
22. Ejecuta el mandato “yes mensaje2 > /dev/null”. Por medio del teclado (Ctrl + Z), o por medio de kill (con la señal SIGSTOP ó 19 y con el PID
correspondiente) envía al proceso
una señal de “detenido”.
23. Comprueba que el proceso está detenido por medio de jobs.
24. Para recuperar una tarea detenida sólo tienes que ejecutar fg
(foreground) o bg (background), dependiendo de que quieras que la tarea
se ejecute en primer o segundo plano. Comprueba con fg que la tarea vuelve a primer plano.
25. Por medio de una señal o del atajo de teclado detén de nuevo la tarea.
Vuelve a iniciarla, esta vez en segundo plano (bg). Vuelve a detenerla sin traerla a primer plano (puedes usar “jobs” para conocer el estado de las tareas
en ejecución). Para ello debes usar obligatoriamente señales por
medio de kill.
26. Crea nuevas tareas por medio de “yes” en primer y segundo plano y prueba
a detenerlas y reanudarlas por medio de bg, fg y las señales de kill.
27. Vamos a recuperar ahora la idea de que todos los procesos dependen
de su
proceso “padre”. Ejecuta varias veces seguidas el mandato “yes hola >
/dev/null &”. Ejecuta
una nueva terminal. En
esta terminal comprueba
ahora la estructura de “pstree”. ¿Quién es el antecesor
directo de todos ellos? Ejecuta “top –u alumno” para comprobar qué
tareas tienes en
ejecución y cuáles son las que más recursos consumen. Si cerrases la terminal en que se encuentran los procesos “yes” ejecutándose, esto “mataría” todos los procesos “yes” que dependen de la misma. Teniendo en cuenta que “init” es el proceso “padre” de todos los procesos que están en
ejecución, imagina
lo que sucedería al ejecutar “kill –s 9 1”. Desde la
consola original, envía una señal de terminación a todos los procesos
“yes” creados (trayéndolos a “fg” y ejecutando “Ctrl + C” o enviándoles una señal
a través de “kill”).
El antecesor
de todos es Init.
Las tareas que mas consumen son las de PID de yes.
Al
ejecutar Kill –s 9 1 , todos los procesos se matarían, si desde la consola
original les enviamos señales de kill, estos se ordenan uno a uno según la
señal, eliminándose de esta forma.
28. Linux también dispone de utilidades para
la programación de tareas; las
tareas programadas son procesos que se ejecutarán (siempre y cuando la máquina esté encendida)
de forma planificada. El programa que nos
permite programar tareas desde línea de mandatos se llama cron.
Puedes leer el manual de cron o los siguientes enlaces para aprender
las nociones básicas sobre su sintaxis, http://es.wikipedia.org/wiki/Cron_(Unix), http://www.linuxtotal.com.mx/index.php?cont=info_admon_006 (quizá alguno de los archivos a que hacen referencia estén en lugares distintos en
nuestra distribución, lo importante es que recuerdes la sintaxis
y la forma de uso).
Comprueba que “cron” está activo en tu ordenador (puedes observar si aparece
en pstree). El proceso “cron” se debe encontrar siempre en ejecución, para que a la hora y día que tenga programada alguna
tarea pueda ejecutar la misma. También te puedes asegurar de que el mismo
está en marcha por medio del mandato:
$ sudo service cron start
29. Existen
diversas formas de programar nuevas
tareas. El fichero en el
que se encuentran las tareas programadas se llama “/etc/crontab”. Es un fichero de texto, así que puedes editarlo, por ejemplo, con nano. Para ejecutarlo deberás disponer de permisos de superusuario. Ejecuta:
$sudo nano /etc/crontab
Por defecto deberían
aparecer varias tareas
programadas del sistema.
La estructura de cada una de las líneas
es la siguiente:
minuto(s)
- hora - día del mes mes
- día de la semana usuario
- mandato
De esta forma, la siguiente línea:
min. -
hr. d. mes
mes
d. sem. us. -
mandato
5,20,35,50 * * * * alumno cd
/home/alumno/Escritorio;
wget http://www.utec.edu.sv
Significará que a los minutos 5, 20, 35, 50 de todas las horas (*), de todos los días del mes (*), de todos los meses y de todos los días de la semana
(*), el usuario alumno ejecutará los mandatos
cd /home/alumno/Escritorio; wget http://www.utec.edu.sv”. Inserta la línea
anterior en la última línea de tu fichero
crontab, de forma que la acción se
ejecute cada cinco minutos (5,10,15,20,25,30,35,40,45,50,55). Guárdalo. Copia la línea que describe la tarea programada en tu guión de prácticas.
30. Crea otra nueva tarea programada, basándote en la anterior, para que
cada 3 minutos de todas las horas, todos los días cada mes, de todos los
meses, cualquier día de la semana,
el usuario alumno realice el siguiente
mandato:
Moverse a la carpeta Escritorio;
lanzar un mensaje
con echo “Otra vez aquí” redirigido
a un fichero de
nombre “aqui” (echo “Otra vez aqui” >> aqui).
Copia la línea que describe la tarea programada en tu guión de prácticas.
# m h dom mon dow user
command
17 * * *
* root cd / && run-parts --report
/etc/cron.hourly
25 6 * *
* root test -x /usr/sbin/anacron || ( cd /
&& run-parts --report /etc/cron.daily )
47 6 * *
7 root test -x /usr/sbin/anacron || ( cd /
&& run-parts --report /etc/cron.weekly )
52 6 1 *
* root test -x /usr/sbin/anacron || ( cd /
&& run-parts --report /etc/cron.monthly )
*
3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57 * * *
root cd
/home/alumno/Escritorio/Aqui;
echo"Otra Vez Aqui"
#
31. Basándote en la sintaxis del fichero crontab tal y como viene explicada en
http://es.wikipedia.org/wiki/Cron_(Unix) define una tarea programada tal que el día 3 de Junio de cada año, a la hora que tú prefieras, cree
una carpeta en el Escritorio
de tu
ordenador y dentro de ella un fichero que se llame “log” donde, por
medio de echo, se envíe el mensaje “Hoy
es día 3 de Junio”.
Copia la línea que describe
la tarea programada en tu guión de
prácticas.
# m h dom mon dow user
command
17 * * *
* root cd / && run-parts --report
/etc/cron.hourly
25 6 * *
* root test -x /usr/sbin/anacron || ( cd /
&& run-parts --report /etc/cron.daily )
47 6 * *
7 root test -x /usr/sbin/anacron || ( cd /
&& run-parts --report /etc/cron.weekly )
52 6 1 *
* root test -x /usr/sbin/anacron || ( cd /
&& run-parts --report /etc/cron.monthly )
* * 3 6* root
cd /home/alumno/Escritorio/Prueba/log; echo”Hoy es dia 3 de Junio”
#
Comprueba que las tareas programadas anteriores cumplen con su cometido (en particular las dos primeras).
Comprobado
Comentarios
Publicar un comentario