Pgina: 1
SESIN N 06
MANEJO DE ENLACES A FICHEROS Y CONTROL DE
TAREAS
I
OBJETIVOS
II
TEMAS A TRATAR
Manejo de enlaces de archivos
o Enlaces duros y simblicos
Tareas y procesos
o Primer plano y segundo plano
o Eliminacin de tareas
o Parada y relanzamiento de tareas
o Prioridad de los procesos
o Comando relacionados
III
MARCO TEORICO
Manejando enlaces de archivos
Los enlaces le permiten dar a un nico archivo mltiples nombres. Los archivos son
identificados en el sistema por su nmero de inodo, el cual es el nico identificador del
archivo para el sistema de archivos. Un directorio es una lista de nmeros de inodo con sus
correspondientes nombres de archivo. Cada nombre de archivo en un directorio es un enlace
a un inodo particular.
Pgina: 2
Aqu, el archivo foo tiene el nmero de inodo 22192 (en su caso podra ser otro vaor) en
el sistema de archivos. Podemos crear otro enlace a foo, llamado bar:
# ln foo bar
Ahora, accediendo a foo o a bar accederemos al mismo archivo. Si hace cambios en foo,
estos cambios tambin sern efectuados en bar. Para todos los efectos, foo y bar son el
mismo archivo.
Estos enlaces son conocidos como enlaces duros (hard links) porque directamente crean
el enlace al inodo.
Nota: solo podemos crear enlaces duros entre archivos del mismo sistema de archivos.
Los enlaces simblicos, como se ver ms adelante, no tienen esta restriccin.
Cuando borra un archivo con rm, est solamente borrando un enlace a un archivo. Si
usa el comando
# rm foo
La orden ls -i mostrar los nmeros de inodo. Solo el enlace de nombre foo es borrado;
bar todava existir. Un archivo es borrado definitivamente del sistema cuando no
quedan enlaces a l.
Usualmente, los archivos tienen un nico enlace, por lo que el uso de rm los borra. Pero
si el archivo tiene mltiples enlaces, el uso de rm solo borrara un nico enlace; para
borrar el archivo, deber borrar todos los enlaces del archivo.
La orden ls -l muestra el nmero de enlaces a un archivo (entre otra informacin).
# ls -l foo bar
-rw-r--r-- 2 root root 12 Aug 5 16:51 bar
-rw-r--r-- 2 root root 12 Aug 5 16:50 foo
Enlaces simblicos
Los enlaces simblicos son otro tipo de enlaces, diferente al enlace duro. Un enlace
simblico permite dar a un archivo el nombre de otro, pero no enlaza el archivo con un
inodo. Dentro del enlace simblico se guarda la ruta donde ubicar al archivo destino.
La orden "ln -s" crea un enlace simblico a un archivo. Por ejemplo, si usamos la orden
Karim Guevara Puente de la Vega
Pgina: 3
# ln -s foo bar
crearemos un enlace simblico bar apuntando al archivo foo. Si usamos ls -i, veremos
que los dos archivos tienen inodos diferentes (los valores podran ser diferentes a los
mostrados aqu).
# ls -i foo bar
22195 bar 22192 foo
Tareas y procesos
Control de Tareas es una utilidad incluida en muchos shells, que permite el control de
multitud de comandos o tareas al momento. Antes de seguir, deberemos hablar un poco
sobre los procesos.
Cada vez que se ejecuta un programa, usted lanza lo que se conoce como proceso, que
es simplemente el nombre que se le da a un programa cuando se est ejecutando. El
comando ps visualiza la lista de procesos que se estn ejecutando actualmente, por
ejemplo:
/home/usuario# ps
PID TTY STAT TIME COMMAND
24 3 S 0:03 (bash)
161 3 R 0:00 ps
Karim Guevara Puente de la Vega
Pgina: 4
Pgina: 5
La serie de yes continuar hasta el infinito, a no ser que usted la elimine, pulsando la
tecla de interrupcin, generalmente CTRLC. Tambin puede deshacerse de esta serie
de yes redirigiendo la salida estndar de yes hacia /dev/null, que como recordar es
una especie de "agujero negro" o papelera para los datos. Todo lo que usted enve all,
desaparecer.
/home/usuario# yes > /dev/null
Como podr ver, ha regresado al shell. Pero qu es eso de "[1] 164"?, Se est
ejecutando realmente el comando yes?
"[1]" representa el nmero de tarea del proceso yes. El shell asigna un nmero a cada
tarea que se est ejecutando. Como yes es el nico comando que se est ejecutando, se
le asigna el nmero de tarea 1. El nmero "164" es el nmero de identificacin del
Karim Guevara Puente de la Vega
Pgina: 6
proceso, o PID, que es el nmero que el sistema le asigna al proceso. Ambos nmeros
pueden usarse para referirse a la tarea como veremos despus.
Ahora usted tiene el proceso yes corriendo en segundo plano, y enviando
constantemente la seal y hacia el dispositivo /dev/null. Para chequear el estado del
proceso, utilice el comando interno de la shell "jobs":
/home/usuario# jobs
[1]+ Running yes >/dev/null &
/home/usuario$
Tambin puede usar el comando ps, como mostramos antes, para comprobar el estado
de la tarea.
Cuando se identifica la tarea con el nmero de tarea, se debe preceder el nmero con el
carcter de porcentaje (%"). Ahora que ya hemos matado la tarea, podemos usar el
comando jobs de nuevo para comprobarlo:
/home/usuario# jobs
[1]+ Terminated yes >/dev/null
/home/usuario$
La tarea esta, en efecto, muerta, y si usa el comando jobs de nuevo, no mostrar nada.
Tambin podr matar la tarea usando el nmero de ID de proceso (PID), el cual se
muestra conjuntamente con el ID de tarea cuando arranca la misma. En nuestro ejemplo
el ID de proceso es 164, as que el comando:
/home/usuario$ kill 164 es equivalente a /home/usuario$ kill %1
De nuevo, dado que yes corre en primer plano, no debe retornar el prompt de la shell.
Ahora, en vez de interrumpir la tarea con CTRLC, suspenderemos la tarea. El
suspender una tarea no la mata: solamente la detiene temporalmente hasta que se desee
retomarla. Para hacerlo debemos pulsar la tecla de suspender, que suele ser CTRLZ.
Pgina: 7
El shell muestra el nombre del comando de nuevo, de forma que tenga conocimiento de
que tarea es la que ha puesto en primer plano. Pare la tarea de nuevo, con CTRLZ.
Esta vez utilice el comando "bg" para poner la tarea en segundo plano. Esto har que el
comando siga ejecutndose igual que si lo hubiese hecho desde el principio con "&"
como en la seccin anterior.
/home/usuario$ bg
[1]+ yes >/dev/null &
/home/usuario$
Y tenemos de nuevo el prompt. El comando "jobs" debera decirnos que "yes" se est
ejecutando, y podemos matar la tarea con "kill" tal y como lo hicimos antes.
Cmo podemos parar la tarea de nuevo? Si pulsa CTRLZ no funcionar, ya que el
proceso est en segundo plano. La respuesta es poner el proceso en primer plano de
nuevo, con el comando fg, y entonces pararlo. Como puede observar, podr usar fg
tanto con tareas detenidas, como con las que estn corriendo en segundo plano.
Hay una gran diferencia entre una tarea que se encuentra en segundo plano, y una que se
encuentra detenida. Una tarea detenida es una tarea que no se est ejecutando, es decir,
que no usa tiempo de CPU, y que no est haciendo ningn trabajo (la tarea an ocupa un
lugar en memoria, aunque puede ser volcada a disco). Una tarea en segundo plano, se
est ejecutando, y usando memoria, a la vez que completando alguna accin mientras
usted hace otro trabajo. Sin embargo, una tarea en segundo plano puede intentar mostrar
texto en su terminal, lo que puede resultar molesto si est intentando hacer otra cosa.
Por ejemplo, si us el comando:
/home/usuario$ yes &
sin redirigir stdout a /dev/null, una cadena de yes se mostraran en su monitor, sin
modo alguno de interrumpirlo (no puede hacer uso de CTRLC para interrumpir tareas
en segundo plano). Para poder parar esas interminables yes, tendra que usar el
comando fg para pasar la tarea a primer plano, y entonces usar |_ctrlC_| para matarla.
Pgina: 8
Otra observacin: Normalmente, los comandos "fg" y "bg" actan sobre el ltimo
proceso parado (indicado por un "+" junto al nmero de tarea cuando usa el comando
jobs). Si usted tiene varios procesos corriendo a la vez, podr mandar a primer o
segundo plano una tarea especfica indicando el ID de tarea como argumento de fg o bg,
como en:
/home/usuario$ fg %2 (para la tarea de primer plano nmero 2), o
/home/usuario$ bg %3 (para la tarea de segundo plano nmero 3).
No se pueden usar los ID de proceso con fg o bg. Adems de esto, si usa el nmero de
tarea por s solo, como:
/home/usuario$ %2 es equivalente a /home/usuario$ fg %2
Recordemos que el uso de control de tareas es una utilidad del shell. Los comandos fg,
bg y Jobs son internos del shell. Si por algn motivo utilizamos una shell que no soporta
control de tareas, no dispondremos de estos comandos.
Por ejemplo, si quisiramos ejecutar un proceso con la mayor prioridad disponible (en
este caso el script prueba.pl) haramos lo siguiente:
# nice -n-20 ./prueba.pl
Pgina: 9
pstree: muestra los procesos mediante un rbol, mostrando las relaciones padrehijo.
Karim Guevara Puente de la Vega
Pgina:10
skill / killall / pkill: Igual que kill pero para un grupo de procesos.
fuser: Identifica qu procesos (PID) utilizan un archivo determinado.
pgrep: listado selectivo de procesos, basado en los nombres de los mismos y en otros
tipos de atributos.
time: muestra los tiempos de ejecucin de un procesos. Real : tiempo real gastado
(duracin real), user: tiempo CPU de usuario, sys: tiemepo CPU consumido como
proceso de kernel
IV
ACTIVIDADES
01. Crear un archivo de texto llamado ej0 que contenga su NOMBRE y APELLIDOS.
02. Crear un par de enlaces duros con ej0 llamados hard1 y hard2.
03. Crear un enlace simblico a ej0 llamado sym1
04. Crear un directorio dir1 y crear un enlace llamado dir2.
05. Hacer un ls -l para ver los enlaces creados.
~$
~$
~$
~$
~$
Nota: En el grfico, los enlaces duros se simbolizan con lneas con terminacin en crculo. Los
enlaces simblicos se grafican con lneas terminadas en flecha.
Los enlaces rgidos no muestran nada particular listados con 'ls -l' pero los enlaces
simblicos vienen acompaados de una flecha que apunta a otro nombre de fichero.
Hay una columna de nmeros a continuacin de los permisos. Se trata de una columna
que indica el nmero de enlaces rgidos que estn asociados a un mismo fichero.
En el caso de 'ej0', 'hard1' y 'hard2' aparece un 3 y est claro porque son enlaces
creados por nosotros pero el directorio 'dir1' tiene un 2. Esto significa que existe otro
Karim Guevara Puente de la Vega
Pgina:11
enlace rgido para ese directorio que nosotros no hemos creado. Se ha creado
automticamente al crear 'dir1'. Acurdese que todos los directorios se crean con un par
de entradas que son '.' y '..' El 2 por lo tanto en este caso se debe a la entrada '.' dentro
del propio 'dir1' y si dentro de 'dir1' existieran directorios habra que contabilizar cada
uno de los '..' de los directorios hijos como enlaces rgidos de 'dir1'.
06. Ver el contenido de ej0.
07. Agregar (usando el operador >>) el texto DNI al archivo hard1.
08. Ver nuevamente el contenido de ej0.
~$
~$
~$
La informacin es accesible desde distintos nombres de ficheros pero no son copias sino
que se trata de la misma unidad de informacin.
09. Borrar ej0. Hacer un cat a sym1. Hacer un cat
a hard1.
En el caso de los enlaces rgidos da igual cual es el
enlace o fichero original. Son totalmente
equivalentes y la informacin solo desaparecer del
sistema cuando el ltimo enlace rgido sea
eliminado. La diferencia con el enlace simblico es que acta simplemente accediendo
al nombre del fichero que tiene almacenado en su interior. Por eso en el caso que
acabamos de ver 'sym1' queda apuntando a 'ej0' que es un fichero que ya no existe.
10. Hacer un ls -li
11. Cambiar el nombre de 'hard2' por 'ej0' usando el
comando mv. Con esto el link simblico debera funcionar
nuevamente.
12. Verificar que sym1 es vlido (cat sym1)
13. Mover el enlace simblico 'sym1' a 'dir1' usando el
comando mv.
14. Verificar si funciona sym1 (que est ahora dentro de dir1).
Hay error? Por qu? :
~$
Los enlaces simblicos son relativos si no se especifica la ruta completa del target al
momento de su creacin.
15. Trasladar 'ej0' a 'dir2' y comprobar cmo queda todo y s ./dir1/sym1 es vlido
nuevamente
16. Ahora vamos a crear un symlink con ruta absoluta. Dentro de dir1 creamos un
symlink de nombre "ultimo_symlink", pero esta vez especificando el path
completo del target (/..../dir1/ej0).
Una manera de hacerlo fcil para los casos donde el path completo sea muy largo:
ln -s `pwd`/ej0 ultimo_symlink
Karim Guevara Puente de la Vega
Pgina:12
~$
24. Matar todos los procesos que han quedado "perdidos" antes de cerrar las sesiones.