3.12. Control de tareas.

Anuncio
3.12. Control de tareas.
119
/home/larry# 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
/home/larry#
La segunda columna del listado, ”2”, especifica el número de enlaces al fichero.
Asi resulta que un directorio no es realmente más que un fichero que contiene información sobre asociaciones enlaces-a-inodos. Además, cada directorio contiene al menos dos enlaces rı́gidos: ”.” (un enlace
apuntando a él mismo) y ”..” (un enlace apuntando a su directorio padre). El enlace ”..” del directorio raı́z
(/) simplemente vuelve a apuntar a /. (En otras palabras, el directorio padre del directorio raı́z es él mismo.)
3.11.2.
Enlaces simbólicos.
Los enlaces simbólicos son otro tipo de enlace, diferente al enlace rı́gido. Un enlace simbólico permite
dar otro nombre a un fichero, pero no enlaza el fichero mediante el inodo.
La orden ln -s crea un enlace simbólico a un fichero. Por ejemplo, si utiliza la orden
/home/larry# ln -s foo bar
creará un enlace simbólico llamado bar que apunte al fichero foo. Si utiliza ls -i, verá que los dos
ficheros tienen diferentes inodos.
/home/larry# ls -i foo bar
22195 bar
22192 foo
/home/larry#
Sin embargo, usando ls -l, vemos que el fichero bar es un enlace simbólico apuntando a foo.
/home/larry# ls -l foo bar
lrwxrwxrwx
1 root
root
3 Aug
-rw-r--r--
1 root
root
12 Aug
5 16:51 bar -> foo
5 16:50 foo
/home/larry#
Los permisos de fichero de un enlace simbólico no se utilizan (siempre aparecen como rxwrxwrxw).
En su lugar, los permisos del enlace simbólico están determinados por los permisos del destino del enlace
simbólico (en nuestro ejemplo, el fichero foo).
Funcionalmente, los enlaces rı́gidos y simbólicos son similares, pero hay diferencias. Por un lado, se
pueden crear enlaces simbólicos a ficheros que no existen, cosa que no sucede con los enlaces rı́gidos. Los
enlaces simbólicos son procesados de manera distinta a los rı́gidos por el núcleo, lo que constituye una mera
diferencia técnica pero que a veces puede resultar importante. Los enlaces simbólicos son de ayuda porque
identifican al fichero al que apuntan; con enlaces rı́gidos, no hay una manera fácil de determinar qué ficheros
están enlazados al mismo inodo.
Los enlaces se utilizan en muchos lugares dentro de un sistema GNU/Linux. Los enlaces simbólicos
son especialmente importantes para las bibliotecas compartidas en /lib. Consulte la página 157 para más
información.
3.12.
Control de tareas.
3.12.1.
Tareas y procesos.
El control de tareas es una caracterı́stica que incluyen muchos intérpretes de órdenes (incluyendo
bash y tcsh) que permiten controlar múltiples órdenes o tareas ejecutándose a la vez. Antes de ir más
lejos, hay que hablar de los procesos.
Cada vez que se ejecuta un programa, se arranca lo que se denomina un proceso. La orden ps muestra
una lista de los procesos actualmente en ejecución, como se ve aquı́:
120
Tutorial de GNU/Linux
/home/larry# ps
PID TT STAT
24 3 S
161 3 R
TIME COMMAND
0:03 (bash)
0:00 ps
/home/larry#
En la primera columna aparece el PID o identificador de proceso, un número único dado a cada proceso
en ejecución. La última columna, COMMAND, es el nombre de la orden en ejecución. Aquı́, estamos viendo
únicamente los procesos que está ejecutando el propio Larry. (También hay otros muchos procesos en ejecución en el sistema—”ps -aux” los lista todos.) Éstos son bash (el intérprete de órdenes de Larry) y
la propia orden ps. Como puede ver, bash se ejecuta al mismo tiempo que la orden ps. bash hizo que
se ejecutara ps cuando Larry escribió la orden. Cuando ps ha finalizado su ejecución (después de haber
mostrado la tabla de procesos), el proceso bash vuelve a tomar el control, y muestra el sı́mbolo del sistema,
listo para recibir otra orden.
A un proceso en ejecución se le llama también tarea. Los términos proceso y tarea son intercambiables.
Sin embargo, nos referimos a un proceso como ”tarea” cuando lo usamos en conjunción con control de tareas
—una caracterı́stica del intérprete de órdenes que permite conmutar entre varios procesos independientes.
En muchos casos, los usuarios ejecutan una única tarea a la vez—cualquiera que fuera la última orden
que escribieron. Sin embargo, usando el control de tareas, se puede ejecutar varias tareas a la vez y conmutar
entre ellas cuando haga falta.
¿Para qué puede ser esto útil? Digamos que está editando un fichero de texto y quiere interrumpir la
edición para hacer cualquier otra cosa. Mediante el control de tareas, puede suspender temporalmente el
editor, volver al sı́mbolo del intérprete de órdenes y empezar a trabajar en otra cosa. Cuando haya terminado,
puede volver al editor donde lo dejó, como si no lo hubiera abandonado. Hay otros muchos usos prácticos del
control de tareas.
3.12.2.
Primer plano y segundo plano.
Las tareas pueden estar tanto en primer plano como en segundo plano. Sólo puede haber una tarea en
primer plano cada vez. La tarea que está en primer plano es aquella con la que se interactúa –recibe la entrada
desde el teclado y envı́a la salida a la pantalla, a menos que, por supuesto, se haya redireccionado la entrada o
la salida, como se describe en la página 113–. Por otro lado, las tareas que están en segundo plano no reciben
entradas desde el terminal –en general, se ejecutan tranquilamente sin necesidad de interacción–.
Algunas tareas tardan mucho tiempo en acabar y no hacen nada interesante mientras se están ejecutando.
Compilar programas es una de esas tareas, como también lo es comprimir un fichero grande. No hay ningún
motivo para estar sentado y aburrido mientras espera a que estas tareas acaben; simplemente ejecútelos en
segundo plano. Mientras esas tareas corren en segundo plano, existe libertad para ejecutar otros programas.
Las tareas también pueden ser suspendidas. Una tarea suspendida es una tarea que está detenida temporalmente. Después de suspender una tarea, se puede hacer que continúe en primer o segundo plano cuando
haga falta. Reanudar una tarea suspendida no cambia el estado de la tarea de ninguna manera –la tarea continúa su ejecución por donde se quedó–.
Suspender una tarea no es lo mismo que interrumpirla. Cuando se interrumpe un proceso en ejecución
(pulsando la tecla de interrupción, que suele ser Ctrl-C )10 , se mata ese proceso, para siempre. Una vez que
se mata el proceso, no hay manera de que se reanude. Hay que ejecutar la orden otra vez. Además, algunos
programas capturan la interrupción, de manera que pulsar Ctrl-C no matará inmediatamente al proceso.
Esto permite al programa llevar a cabo cualquier operación de limpieza necesaria antes de salir. De hecho,
algunos programas no permitirán de ningún modo que se les mate mediante interrupción.
Comencemos con un ejemplo simple. La orden yes es una orden inútil en apariencia que manda una
cadena infinita de ys a la salida estándar. (En realidad sı́ es útil. Si se enlaza mediante una tuberı́a la salida de
yes a otra orden que realice una serie preguntas de sı́ o no, la cadena de ys confirmará todas las preguntas.)
Intentémoslo:
10 Se
puede establecer la tecla de interrupción con la orden stty.
Control de Tareas
121
/home/larry# yes
y
y
y
y
y
Las ys continuarán ad infinitum. Puede matar el proceso pulsando la tecla de interrupción, que normalmente
es Ctrl-C . Para que no tengamos que aguantar la molesta cadena de ys, redirijamos la salida estándar de
yes a /dev/null. Si recuerda, /dev/null actúa como un ”agujero negro” para los datos. Cualquier
dato que se le envı́e desaparece. Es un modo muy efectivo de silenciar un programa charlatán.
/home/larry# yes > /dev/null
Ah, mucho mejor. No aparece nada, pero el sı́mbolo del intérprete de órdenes no vuelve. Esto es porque
yes está todavı́a en ejecución, y está mandando esas inútiles ys a /dev/null. Para matar otra vez, la tarea,
pulse la tecla de interrupción.
Supongamos que quiere que la orden yes continúe su ejecución pero conservando el sı́mbolo del
intérprete de órdenes para que pueda trabajar en otras cosas. Puede pasar yes a segundo plano, permitiendo su ejecución, sin necesidad de interactuar.
Una manera de poner un proceso en segundo plano es añadir un ”&” al final de la orden.
/home/larry# yes > /dev/null &
[1] 164
/home/larry#
Como puede ver, el sı́mbolo del intérprete de órdenes ha vuelto. Pero ¿qué es este ”[1] 164”? Y ¿está ejecutándose realmente la orden yes?
”[1]” representa el número de tarea para el proceso yes. El intérprete de órdenes asigna un número
de tarea a cada tarea en ejecución. Dado que yes es la única tarea que estamos ejecutando, tiene asignado
el número de trabajo 1. ”164” es el identificador de proceso, o PID, el número otorgado a la tarea por el
sistema. Se puede usar cualquiera de los números para referirse a la tarea, como se verá más adelante.
Ahora tenemos el proceso yes ejecutándose en segundo plano, mandando continuamente una cadena de
ys a /dev/null. Para comprobar el estado de este proceso, utilizamos la orden interna del intérprete de
órdenes jobs.
/home/larry# jobs
[1]+
Running
yes >/dev/null
&
/home/larry#
Efectivamente, ahı́ está. También se podrı́a haber utilizado la orden ps tal y como se mostró arriba para
comprobar el estado de la tarea.
Para acabar con la tarea, utilice la orden kill. Esta orden toma un número de tarea o un identificador de
proceso como argumento. Ésta era la tarea número 1, ası́ que usando la orden
/home/larry# kill %1
se mata la tarea. Cuando se identifica la tarea con su número de tarea, se debe anteponer al número un carácter
de tanto por ciento (” %”).
Ahora que ha matado la tarea, utilice jobs otra vez para comprobarlo:
/home/larry# jobs
[1]+
Terminated
/home/larry#
yes >/dev/null
122
Tutorial de GNU/Linux
Desde luego, la tarea está muerta, y si utiliza la orden jobs otra vez, no deberı́a aparecer ya nada.
También se puede matar la tarea usando el número de identificación del proceso (PID), que aparece junto
con el número de tarea cuando lo arranca. En nuestro ejemplo, el identificador de proceso es 164, ası́ que la
orden
/home/larry# kill 164
equivale a
/home/larry# kill %1
No necesita usar ” %” para hacer referencia a una tarea mediante su identificador de proceso.
3.12.3.
Parando y relanzando tareas
Hay otra manera de pasar una tarea a segundo plano. Puede arrancar la tarea normalmente (en primer
plano), suspender la tarea, y reiniciarla en segundo plano.
Primero, arranque el proceso yes en primer plano, como hizo antes:
/home/larry# yes > /dev/null
Otra vez, como yes está ejecutándose en primer plano, no deberı́a ver el sı́mbolo del intérprete de órdenes.
Ahora, mejor que interrumpir la tarea con Ctrl-C , suspéndala. Suspender una tarea no la mata: sólo
la detiene temporalmente hasta que se la reinicia de nuevo. Para hacer esto, pulse la tecla de suspensión, que
normalmente es Ctrl-Z .
/home/larry# yes > /dev/null
ctrl-Z
[1]+
Stopped
yes >/dev/null
/home/larry#
Mientras la tarea está suspendida, simplemente no está en ejecución. No se emplea tiempo de CPU para esa
tarea. Sin embargo, puede reiniciar la tarea, lo que provoca que se ejecute otra vez como si nada hubiera
pasado. Continuará su ejecución por donde se quedó.
Para reiniciar la tarea en primer plano, utilice la orden fg (de ”foreground”).
/home/larry# fg
yes >/dev/null
El intérprete de órdenes muestra el nombre de la orden otra vez para que esté al tanto de qué tarea acaba
de mandar a primer plano. Detenga la tarea otra vez con Ctrl-Z . Esta vez, use la orden bg para pasar la
tarea a segundo plano. Esto provoca que la orden se ejecute como si lo hubiera arrancado con ”&”, como en
la última sección.
/home/larry# bg
[1]+ yes >/dev/null &
/home/larry#
Y aquı́ tiene su sı́mbolo del intérprete de órdenes de vuelta. jobs deberı́a informar que yes está ciertamente ejecutándose, y puede matar la tarea con kill como hicimos antes.
¿Cómo se puede detener la tarea otra vez? Utilizar Ctrl-Z no funcionará, porque la tarea está en
segundo plano. La respuesta es pasar la tarea a primer plano con fg, y luego detenerla. Tal y como parece,
puede utilizar fg tanto en tareas detenidas como en tareas en segundo plano.
Hay una gran diferencia entre una tarea en segundo plano y una tarea detenida. Una tarea detenida no
está en ejecución —no está usando tiempo de CPU, y no está haciendo nada (la tarea todavı́a ocupa memoria
del sistema, aunque puede haber sido volcada a disco). Una tarea en segundo plano sı́ está ejecutándose y
usando memoria, al tiempo que completa alguna acción mientras usted hace otra cosa.
Sin embargo, una tarea en segundo plano puede intentar mostrar texto por el terminal, lo que puede
resultar molesto si está intentando trabajar en otra cosa. Por ejemplo, si utilizó la orden
3.13. Uso del editor vi
123
/home/larry# yes &
sin redirigir stdout a /dev/null, una cadena de ys estará apareciendo en la pantalla, sin posibilidad de interrumpirla. (No se puede usar Ctrl-C para interrumpir tareas en segundo plano.) Para detener las infinitas
ys, utilice la orden fg para pasar la tarea a primer plano, y luego utilice Ctrl-C para matarla.
Otra nota. Las órdenes fg y bg normalmente afectan a la última tarea detenida (indicado por un ”+”
junto al número de tarea cuando se usa la orden jobs). Si está ejecutando diversas tareas a la vez, puede
pasar tareas a primer o segundo plano pasando el número de tarea como argumento a fg o bg, como en
/home/larry# fg %2
(para pasar la tarea número 2 a primer plano), o
/home/larry# bg %3
(para pasar la tarea número 3 a segundo plano). No se pueden usar identificadores de proceso (PID) con fg
o bg.
Además, usar el número de tarea sólamente, como en
/home/larry# %2
equivale a
/home/larry# fg %2
Recuerde que el control de tareas es una caracterı́stica del intérprete de órdenes. Las instrucciones fg,
bg y jobs son internas del intérprete de órdenes. Si por cualquier motivo usted utiliza un intérprete de
órdenes que no soporte control de tareas, no espere encontrar estas instrucciones disponibles.
Por añadidura, hay algunos aspectos del control de tareas que varı́an entre bash y tcsh. De hecho,
algunos intérpretes de órdenes no proporcionan control de tareas en absoluto—de cualquier manera, la
mayorı́a de los intérpretes de órdenes disponibles para GNU/Linux sı́ lo proporcionan.
3.13.
Uso del editor vi
Un editor de texto es un programa que se usa para editar ficheros que se componen con texto: una carta, un programa en C o un fichero de configuración del sistema. Aunque para GNU/Linux hay disponibles
muchos editores de texto, el único editor que es seguro que vas a encontrar en cualquier sistema UNIX o
GNU/Linux es vi — el “editor visual11 .” El editor vi no es el editor más fácil de usar, ni es muy autoexplicativo. Sin embargo, como vi es tan común en el mundo UNIX/Linux, y algunas veces necesario, merece
un tratamiento aquı́.
La elección de su editor es más que nada una cuestión de gusto y estilo personal. Muchos usuarios
prefieren el barroco, autoexplicativo y potente GNU emacs —un editor con más posibilidades que cualquier
otro programa en el mundo UNIX. Por ejemplo, GNU emacs tiene su propio dialecto interno del lenguaje
de programación LISP, y tiene muchas extensiones (una de las cuales es un programa de inteligencia artificial
similar a Eliza). Sin embargo, como GNU emacs y sus ficheros de soporte son relativamente extensos, puede
que no esté instalado en algunos sistemas. Por otro lado,vi es pequeño y potente pero más difı́cil de usar. De
todas formas, una vez que conozca la forma de funcionamiento de vi, será realmente muy fácil.
Esta sección presenta una introducción a vi —no hablaremos sobre todas sus caracterı́sticas, sólo las
necesarias para empezar. Puede consultar la página del manual de vi si está interesado en aprender más sobre
las caracterı́sticas del editor. Otra alternativa es leer el libro Learning the vi Editor de O’Reilly y asociados,
o el Vi Tutorial de Specialized Systems Consultants (SSC) Inc. Mire el Apéndice A para informarse.
3.13.1.
Conceptos
Mientras se usa vi, en cualquier instante estará en uno de los tres modos de operación. Estos modos se
llaman modo orden, modo inserción, y modo última lı́nea.
11 N.
del T.: visual editor
Descargar