1 |
nimiux 11/05/02 18:42:22 |
2 |
|
3 |
Added: lpi-101-administration-p2.xml |
4 |
Log: |
5 |
New spanish translation: lpi-101-administration-p2.xml. Thanks to Gabriela Villanueva |
6 |
|
7 |
Revision Changes Path |
8 |
1.1 xml/htdocs/doc/es/articles/lpi-101-administration-p2.xml |
9 |
|
10 |
file : http://sources.gentoo.org/viewvc.cgi/gentoo/xml/htdocs/doc/es/articles/lpi-101-administration-p2.xml?rev=1.1&view=markup |
11 |
plain: http://sources.gentoo.org/viewvc.cgi/gentoo/xml/htdocs/doc/es/articles/lpi-101-administration-p2.xml?rev=1.1&content-type=text/plain |
12 |
|
13 |
Index: lpi-101-administration-p2.xml |
14 |
=================================================================== |
15 |
<?xml version="1.0" encoding="UTF-8"?> |
16 |
<!-- $Header: /var/cvsroot/gentoo/xml/htdocs/doc/es/articles/lpi-101-administration-p2.xml,v 1.1 2011/05/02 18:42:22 nimiux Exp $--> |
17 |
<!DOCTYPE guide SYSTEM "/dtd/guide.dtd"> |
18 |
|
19 |
<guide lang="es" disclaimer="articles"> |
20 |
<title>Preparación para el examen de certificación 101 del LPI (segundo |
21 |
lanzamiento), Parte 2</title> |
22 |
|
23 |
<author title="Author"> |
24 |
<mail link="drobbins@g.o">Daniel Robbins</mail> |
25 |
</author> |
26 |
<author title="Author"> |
27 |
<mail link="chouser@g.o">Chris Houser</mail> |
28 |
</author> |
29 |
<author title="Author"> |
30 |
Aron Griffis |
31 |
</author> |
32 |
<!--<author title="Editor"> |
33 |
<mail link="smithj@g.o">Jonathan Smith</mail> |
34 |
</author>--> |
35 |
<author title="Traductora"> |
36 |
<mail link="nilda_46@×××××××.com">Gabriela Villanueva</mail> |
37 |
</author> |
38 |
|
39 |
<abstract> |
40 |
En este tutorial, aprenderá como utilizar expresiones regulares para |
41 |
buscar patrones de texto en archivos, cómo localizar archivos en su |
42 |
sistema y cómo tener control total de los procesos Linux. También |
43 |
tendrá una introducción rápida a tuberías de la interfaz de comandos, |
44 |
redireccionamiento y órdenes de procesamiento de texto. Al final de |
45 |
este tutorial, tendrá una base sólida en administración básica de |
46 |
Linux y estará listo para comenzar con administración avanzada de |
47 |
sistemas Linux en la siguiente parte de este tutorial. |
48 |
</abstract> |
49 |
|
50 |
<!-- La versión original de este artículo fue publicada originalmente |
51 |
por IBM developerWorks y es propiedad de Westtech Information |
52 |
Services. Este documento es una versión actualizada del artículo |
53 |
original y contiene mejoras realizadas por el equipo de documentación |
54 |
de Gentoo Linux --> |
55 |
|
56 |
<version>2</version> |
57 |
<date>2010-11-14</date> |
58 |
|
59 |
<chapter> |
60 |
<title>Antes de comenzar</title> |
61 |
<section> |
62 |
<title>Acerca de este tutorial</title> |
63 |
<body> |
64 |
|
65 |
<p> |
66 |
Bienvenido a “Administración básica”, el segundo de cuatro tutoriales |
67 |
diseñado para prepararlo para el examen 101 del Instituto Profesional |
68 |
de Linux (LPI por sus siglas en inglés). En este tutorial, le |
69 |
mostraremos como utilizar expresiones regulares para buscar archivos |
70 |
utilizando patrones de texto. Después, haremos una introducción al estándar |
71 |
de jerarquía del sistema de archivos (FHS, por sus siglas en inglés), |
72 |
y le mostraremos como encontrar archivos en su sistema. Además le |
73 |
diremos como tomar control total de los procesos de Linux, |
74 |
ejecutándolos en segundo plano, listándolos, separándolos de la |
75 |
terminal y más. También, le daremos una rápida introducción a |
76 |
tuberías de la interfaz de comandos, redireccionamiento, y órdenes de |
77 |
procesamiento de texto. Por último, haremos una introducción a los |
78 |
módulos del núcleo Linux. |
79 |
</p> |
80 |
|
81 |
<p> |
82 |
Este tutorial en particular (parte 2) es ideal para quienes tienen un |
83 |
buen conocimiento básico de bash y quieren recibir una sólida |
84 |
introducción a tareas básicas de administración Linux. Si es nuevo en |
85 |
Linux, le recomendamos que complete la parte 1 de esta serie de |
86 |
tutoriales antes de continuar. Para algunos, este material será |
87 |
nuevo, pero los usuarios Linux más experimentados encontrarán en este |
88 |
tutorial una buena manera de complementar sus conocimientos básicos |
89 |
de administración Linux. |
90 |
</p> |
91 |
|
92 |
<p> |
93 |
Para aquellos que han tomado el lanzamiento 1 de este tutorial por |
94 |
razones diferentes a la preparación para el examen LPI, probablemente |
95 |
no sea necesario tomar esta versión. Sin embargo, si planea presentarse |
96 |
a los exámenes, debe considerar seriamente leer este tutorial. |
97 |
</p> |
98 |
|
99 |
</body> |
100 |
</section> |
101 |
<section> |
102 |
<title>Acerca del autor</title> |
103 |
<body> |
104 |
|
105 |
<p> |
106 |
Con residencia en Albuquerque, Nuevo México, Daniel Robbins es el |
107 |
arquitecto en jefe de Gentoo Linux, una metadistribución Linux |
108 |
avanzada basada en puertos (ports). Además escribe artículos, |
109 |
tutoriales y sugerencias para IBM developerWorks zona Linux y servicios |
110 |
de desarrollo Intel. También ha contribuido como autor de muchos libros, |
111 |
incluyendo Samba y SuSE Unleashead. Daniel disfruta pasar tiempo con |
112 |
su esposa Mary y su hija Hadassha. Puede contactar a Daniel en <mail> |
113 |
drobbins@g.o</mail>. |
114 |
</p> |
115 |
|
116 |
<p> |
117 |
Chris Houser, conocido por sus amigos como "Chouser," ha sido un |
118 |
partidario de UNIX desde 1994 cuando se unió al equipo de |
119 |
administración de la red de informática en la Universidad Taylor en |
120 |
Indiana, donde obtuvo su licenciatura en Ciencias de la Computación y |
121 |
Matemáticas. Desde entonces ha trabajado en programación de |
122 |
aplicaciones web, diseño de interfaz de usuario, soporte para |
123 |
programas de vídeo profesional y ahora programando el controlador del |
124 |
dispositivo Tru4 UNIX en Compaq. Además ha contribuido en varios |
125 |
proyectos de programas libres (recientemente en Gentoo Linux). Vive |
126 |
con su esposa y dos gatos en New Shapire. Puede contactarlo en |
127 |
chouser@g.o. |
128 |
</p> |
129 |
|
130 |
<p> |
131 |
Aron Griffis, graduado de la Universidad Taylor con título en |
132 |
Ciencias de la Computación y premiado con el título "Futuro fundador |
133 |
de una comunidad UNIX utópica". Trabajando para conseguir ese |
134 |
objetivo Aron es empleado de Compaq, escribe controladores de red |
135 |
para Tru64 UNIX y utiliza su tiempo libre tocando melodías en el |
136 |
piano o desarrollando Gentoo Linux. Vive con su esposa Amy (también |
137 |
ingeniera UNIX) en Nashua, New Hampshire. |
138 |
</p> |
139 |
|
140 |
</body> |
141 |
</section> |
142 |
</chapter> |
143 |
|
144 |
<chapter> |
145 |
<title>Expresiones regulares</title> |
146 |
<section> |
147 |
<title>¿Qué es una expresión regular?</title> |
148 |
<body> |
149 |
|
150 |
<p> |
151 |
Una expresión regular (también llamada "regex" o "regexp") es una |
152 |
sintaxis especial usada para describir patrones de texto. En los |
153 |
sistemas Linux, las expresiones regulares son comúnmente usadas para |
154 |
encontrar patrones de texto, así como para realizar operaciones de |
155 |
buscar y reemplazar en cadenas de texto. |
156 |
</p> |
157 |
|
158 |
</body> |
159 |
</section> |
160 |
<section> |
161 |
<title>Comparación con Glob</title> |
162 |
<body> |
163 |
|
164 |
<p> |
165 |
Cuando veamos expresiones regulares, puede notar que la sintaxis de |
166 |
expresiones regulares es similar a la del archivo de nombre |
167 |
"englobamiento" que vimos en la parte 1. Sin embargo, no permita que |
168 |
esto lo confunda, su parecido es solo superficial. Ambos, expresiones |
169 |
regulares y los patrones de englobamiento, si bien parecen similares |
170 |
son fundamentalmente diferentes. |
171 |
</p> |
172 |
|
173 |
</body> |
174 |
</section> |
175 |
<section> |
176 |
<title>La subcadena simple</title> |
177 |
<body> |
178 |
|
179 |
<p> |
180 |
Con la advertencia anterior, veamos lo más básico de expresiones |
181 |
regulares, la subcadena simple. Para hacer esto usaremos <c>grep</c>, |
182 |
una orden que busca en el contenido de un archivo una expresión |
183 |
regular determinada. <c>grep</c> imprime cada línea que coincide con |
184 |
la expresión regular e ignora cada línea que no lo hace: |
185 |
</p> |
186 |
|
187 |
<pre caption="grep en acción"> |
188 |
$ <i>grep bash /etc/passwd</i> |
189 |
operator:x:11:0:operator:/root:/bin/bash |
190 |
root:x:0:0::/root:/bin/bash |
191 |
ftp:x:40:1::/home/ftp:/bin/bash |
192 |
</pre> |
193 |
|
194 |
<p> |
195 |
Arriba, el primer parámetro <c>grep</c> es una expresión regular; el |
196 |
segundo es el nombre de un archivo. <c>grep</c> lee cada línea en |
197 |
/etc/passwd y le aplica la expresión regular subcadena simple bash, |
198 |
buscando coincidencias. Si una coincidencia es encontrada, <c>grep</c> |
199 |
imprime cada línea que coincide, de lo contrario, la línea es |
200 |
ignorada. |
201 |
</p> |
202 |
|
203 |
</body> |
204 |
</section> |
205 |
<section> |
206 |
<title>Entendiendo la subcadena simple</title> |
207 |
<body> |
208 |
|
209 |
<p> |
210 |
En general, si está buscando una subcadena, puede especificar el |
211 |
texto literal sin proporcionar caracteres "especiales". El único |
212 |
momento en el que necesitará hacer algo especial sería si su |
213 |
subcadena contiene +, ., *, [, ], o \, en cuyo caso estos caracteres |
214 |
tendrían que estar entre comillas precedidos por una barra invertida. |
215 |
Estos son algunos ejemplos de la subcadena simple de expresiones |
216 |
regulares: |
217 |
</p> |
218 |
|
219 |
<ul> |
220 |
<li>/tmp (busca por la cadena literal /tmp)</li> |
221 |
<li>"\[box\]" (busca por la cadena literal [box])</li> |
222 |
<li>"\*funny\*" (busca por la cadena literal *funny*)</li> |
223 |
<li>"ld\.so" (busca por la cadena literal ld.so)</li> |
224 |
</ul> |
225 |
|
226 |
</body> |
227 |
</section> |
228 |
<section> |
229 |
<title>Metacaracteres</title> |
230 |
<body> |
231 |
|
232 |
<p> |
233 |
Con expresiones regulares, puede realizar búsquedas mucho más |
234 |
complejas que los ejemplos que hemos visto hasta el momento tomando |
235 |
ventaja de los metacaracteres. Uno de estos caracteres es el . |
236 |
(punto) el cual coincide con cualquier carácter: |
237 |
</p> |
238 |
|
239 |
<pre caption="El metacarácter punto"> |
240 |
$ <i>grep dev.hda /etc/fstab</i> |
241 |
/dev/hda3 / reiserfs noatime,ro 1 1 |
242 |
/dev/hda1 /boot reiserfs noauto,noatime,notail 1 2 |
243 |
/dev/hda2 swap swap sw 0 0 |
244 |
#/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1 |
245 |
</pre> |
246 |
|
247 |
<p> |
248 |
En este ejemplo, el texto literal dev.hda no aparece en ninguna de |
249 |
las líneas de /etc/fstab. Sin embargo, grep no buscaba la cadena |
250 |
literal dev.hda, pero si el patrón dev.hda. Recuerde que . coincidirá |
251 |
con cualquier carácter. Como puede ver el metacarácter . es |
252 |
equivalente en su funcionamiento al metacarácter ? de las expansiones |
253 |
"globales". |
254 |
</p> |
255 |
|
256 |
</body> |
257 |
</section> |
258 |
<section> |
259 |
<title>Uso de []</title> |
260 |
<body> |
261 |
|
262 |
<p> |
263 |
Si quisiéramos hacer coincidir un carácter más específicamente que |
264 |
con ., podemos utilizar [ y ] (corchetes) para especificar un |
265 |
subconjunto de caracteres que pueden coincidir: |
266 |
</p> |
267 |
|
268 |
<pre caption="Corchetes en acción"> |
269 |
$ <i>grep dev.hda[12] /etc/fstab</i> |
270 |
/dev/hda1 /boot reiserfs noauto,noatime,notail 1 2 |
271 |
/dev/hda2 swap swap sw 0 0 |
272 |
</pre> |
273 |
|
274 |
<p> |
275 |
Como puede ver, esta función sintáctica particular funciona idéntica |
276 |
a [] de expansiones de "englobamiento". De nuevo, esta es una de las |
277 |
cosas complicadas sobre aprender expresiones regulares -- la sintaxis |
278 |
es similar pero no idéntica a la de expansiones de "englobamiento", lo |
279 |
cual hace que las expresiones regulares sean un tanto confusas de |
280 |
aprender. |
281 |
</p> |
282 |
|
283 |
</body> |
284 |
</section> |
285 |
<section> |
286 |
<title>Usando [^]</title> |
287 |
<body> |
288 |
|
289 |
<p> |
290 |
Puede invertir el significado de los corchetes agregando un ^ |
291 |
inmediatamente después de [. En este caso, los corchetes encontrarán |
292 |
una coincidencia con cualquier carácter que <e>no</e> sea mencionado |
293 |
dentro de los mismos. Una vez más, note que usamos [^] con |
294 |
expresiones regulares y [!] con englobamiento: |
295 |
</p> |
296 |
|
297 |
<pre caption="Corchetes con negación"> |
298 |
$ <i>grep dev.hda[^12] /etc/fstab</i> |
299 |
/dev/hda3 / reiserfs noatime,ro 1 1 |
300 |
#/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1 |
301 |
</pre> |
302 |
|
303 |
</body> |
304 |
</section> |
305 |
<section> |
306 |
<title>Diferentes sintaxis</title> |
307 |
<body> |
308 |
|
309 |
<p> |
310 |
Es importante notar que la sintaxis entre corchetes es |
311 |
fundamentalmente diferente de la utilizada en otras partes de la |
312 |
expresión regular. Por ejemplo, si pone un . dentro de corchetes, |
313 |
esto le permite encontrar una coincidencia literal con ., justo como |
314 |
en los ejemplos 1 y 2 mencionados arriba. En cambio, un . literal |
315 |
fuera de los corchetes se interpreta como un metacarácter a menos |
316 |
que sea precedido de una \. Podemos aprovechar este hecho para |
317 |
imprimir una lista de todas las líneas en <path>/etc/fstab</path> que |
318 |
contengan la cadena literal dev.hda tecleando: |
319 |
</p> |
320 |
|
321 |
<pre caption="Imprimiendo literales usando corchetes"> |
322 |
$ <i>grep dev[.]hda /etc/fstab</i> |
323 |
</pre> |
324 |
|
325 |
<p> |
326 |
Alternativamente podemos escribir: |
327 |
</p> |
328 |
|
329 |
<pre caption="Imprimiendo literales usando excepciones"> |
330 |
$ <i>grep "dev\.hda" /etc/fstab</i> |
331 |
</pre> |
332 |
|
333 |
<p> |
334 |
Es probable que ninguna expresión regular coincida con las líneas del |
335 |
archivo <path>/etc/fstab</path>. |
336 |
</p> |
337 |
|
338 |
</body> |
339 |
</section> |
340 |
<section> |
341 |
<title>El metacarácter "*"</title> |
342 |
<body> |
343 |
|
344 |
<p> |
345 |
Algunos metacaracteres no coinciden con nada por si solos, pero |
346 |
modifican el significado del carácter previo. Un ejemplo de esto es |
347 |
el metacarácter * (asterisco), el cual es usado para coincidir con |
348 |
cero o más ocurrencias del carácter anterior. Tenga en cuenta que |
349 |
esto significa que * tiene un significado diferente en expresiones |
350 |
regulares que en englobamiento: |
351 |
</p> |
352 |
|
353 |
<ul> |
354 |
<li> |
355 |
ab*c coincide con abbbbc pero no con abqc (si fuese |
356 |
englobamiento, coincidiría con ambas cadenas -- ¿Puede determinar |
357 |
por qué?) |
358 |
</li> |
359 |
<li> |
360 |
ab*c coincide con abc pero no con abbqbbc (de nuevo, si fuese |
361 |
englobamiento coincidiría con ambas cadenas) |
362 |
</li> |
363 |
<li> |
364 |
ab*c coincide con ac pero no con cba (si fuese englobamiento, ac |
365 |
no coincidiría, ni tampoco cba) |
366 |
</li> |
367 |
<li> |
368 |
b[cq]*e coincide con bqe y be (si fuese englobamiento, coincidiría |
369 |
bqe pero no be) |
370 |
</li> |
371 |
<li> |
372 |
b[cq]*e coincide con bccqqe pero no con bccc (si fuese |
373 |
englobamiento, coincidiría con la primera pero no con la segunda) |
374 |
</li> |
375 |
<li> |
376 |
b[cq]*e coincide con bqqcce pero no con cqe (si fuese |
377 |
englobamiento, coincidiría con la primera pero no con la segunda) |
378 |
</li> |
379 |
<li> |
380 |
b[cq]*e coincide con bbbeee (no sería el caso con englobamiento) |
381 |
</li> |
382 |
<li> |
383 |
.* coincide con cualquier cadena. (si fuese englobamiento, |
384 |
coincidiría con cualquier cadena que comience con .) |
385 |
</li> |
386 |
<li> |
387 |
foo.* coincidiría con cualquier cadena que comience con foo (si |
388 |
fuese englobamiento, coincidiría con cualquier cadena que |
389 |
comience con los cuatro caracteres literales foo.) |
390 |
</li> |
391 |
</ul> |
392 |
|
393 |
<p> |
394 |
Ahora un pequeño repaso: la línea ac coincide con la expresión |
395 |
regular ab*c por que el asterisco también le permite a la expresión |
396 |
anterior (b) aparecer <e>cero</e> veces. Nuevamente, es fundamental |
397 |
tener en cuenta que el metacarácter * de expresiones regulares se |
398 |
interpreta de manera fundamentalmente diferente que el carácter * de |
399 |
englobamiento. |
400 |
</p> |
401 |
|
402 |
</body> |
403 |
</section> |
404 |
<section> |
405 |
<title>Principio y final de línea</title> |
406 |
<body> |
407 |
|
408 |
<p> |
409 |
Los últimos metacaracteres que cubriremos aquí a detalle son ^ y $, |
410 |
utilizados para encontrar coincidencias al principio y al final de la |
411 |
línea respectivamente. Mediante el uso de ^ al principio de su |
412 |
expresión regular, puede hacer que su patrón esté "anclado" al inicio |
413 |
de la línea. En el siguiente ejemplo, usamos la expresión regular ^# |
414 |
para encontrar cualquier línea que comience con el carácter #: |
415 |
</p> |
416 |
|
417 |
<pre caption="Líneas"> |
418 |
$ <i>grep ^# /etc/fstab</i> |
419 |
# /etc/fstab: static file system information. |
420 |
# |
421 |
</pre> |
422 |
|
423 |
</body> |
424 |
</section> |
425 |
<section> |
426 |
<title>Expresiones regulares de línea completa</title> |
427 |
<body> |
428 |
|
429 |
<p> |
430 |
^ y $ se pueden combinar para coincidir con una línea completa. Por |
431 |
ejemplo, la siguiente expresión regular coincidirá con una línea que |
432 |
comience con el carácter # y termine con el carácter ., con |
433 |
cualquier número de caracteres entre ellos: |
434 |
</p> |
435 |
|
436 |
<pre caption="Encontrando coincidencias en una línea completa"> |
437 |
$ <i>grep '^#.*\.$' /etc/fstab</i> |
438 |
# /etc/fstab: static file system information. |
439 |
</pre> |
440 |
|
441 |
<p> |
442 |
En el ejemplo anterior, encerramos la expresión regular entre |
443 |
comillas simples para prevenir que $ sea interpretado por el |
444 |
intérprete de comandos. Sin las comillas simples, el $ desaparecería |
445 |
de la expresión regular antes de darle a grep la oportunidad de verlo. |
446 |
</p> |
447 |
|
448 |
</body> |
449 |
</section> |
450 |
</chapter> |
451 |
|
452 |
<chapter> |
453 |
<title>FHS y búsqueda de archivos</title> |
454 |
<section> |
455 |
<title>Estándar de jerarquía del sistema de archivos (FHS)</title> |
456 |
<body> |
457 |
|
458 |
<p> |
459 |
El Estándar de Jerarquía del sistema de archivos es un documento que |
460 |
especifica la disposición de los directorios en un sistema Linux. El |
461 |
FHS se diseñó para proporcionar un esquema común para simplificar la |
462 |
distribución de software independiente -- así que este material es en |
463 |
general el mismo entre las distintas distribuciones de Linux. El FHS |
464 |
especifica el siguiente árbol de directorios (tomados directamente de |
465 |
la especificación FHS): |
466 |
</p> |
467 |
|
468 |
<ul> |
469 |
<li>/ (el directorio root)</li> |
470 |
<li>/boot (archivos estáticos del boot loader)</li> |
471 |
<li>/dev (archivos de dispositivos)</li> |
472 |
<li>/etc (anfitrión-configuración específica del sistema)</li> |
473 |
<li>/lib (librerías compartidas esenciales y módulos del núcleo)</li> |
474 |
<li> |
475 |
/mnt (punto de montaje para el montaje temporal de un sistema |
476 |
de archivos) |
477 |
</li> |
478 |
<li>/opt (paquetes de complementos de aplicaciones)</li> |
479 |
<li>/sbin (binarios esenciales del sistema)</li> |
480 |
<li>/tmp (archivos temporales)</li> |
481 |
<li>/usr (jerarquía secundaria)</li> |
482 |
<li>/var (datos variables)</li> |
483 |
</ul> |
484 |
|
485 |
</body> |
486 |
</section> |
487 |
<section> |
488 |
<title>Las dos categorías independientes del FHS</title> |
489 |
<body> |
490 |
|
491 |
<p> |
492 |
El FHS basa su especificación de diseño en la idea de que existen dos |
493 |
categorías independientes de archivos: compartidos vs no compartidos, |
494 |
y variables vs estáticos. Los archivos compartidos pueden, como su |
495 |
nombre lo dice, ser compartidos entre anfitriones; los datos |
496 |
no compartidos son específicos de un anfitrión (por ejemplo, los |
497 |
archivos de configuración). Los datos variables pueden ser |
498 |
modificados; los estáticos no son modificables (excepto en la |
499 |
instalación y mantenimiento de un sistema). |
500 |
</p> |
501 |
|
502 |
<p> |
503 |
El siguiente cuadro resume las cuatro combinaciones posibles, con |
504 |
ejemplos de directorios que pueden formar parte de esas categorías. |
505 |
Una vez más, esta tabla es tomada directamente de la especificación |
506 |
FHS: |
507 |
</p> |
508 |
|
509 |
<pre caption="FHS"> |
510 |
+----------+-----------------+----------------+ |
511 |
| | compartidos | no compartidos | |
512 |
+----------+-----------------+----------------+ |
513 |
|estáticos | /usr | /etc | |
514 |
| | /opt | /boot | |
515 |
+----------+-----------------+----------------+ |
516 |
|variables | /var/mail | /var/run | |
517 |
| | /var/spool/news | /var/lock | |
518 |
+----------+-----------------+----------------+ |
519 |
</pre> |
520 |
|
521 |
</body> |
522 |
</section> |
523 |
<section> |
524 |
<title>Jerarquía secundaria en /usr</title> |
525 |
<body> |
526 |
|
527 |
<p> |
528 |
En <path>/usr</path> encontrará una jerarquía secundaria que luce muy |
529 |
parecida al sistema de archivos de root. No es crítico para |
530 |
<path>/user</path> existir cuando la máquina encienda, puede estar |
531 |
compartido en una red (compartido), o montado en un CD-ROM (estático). |
532 |
La mayoría de las configuraciones de Linux no hacen uso del intercambio |
533 |
de <path>/usr</path>, pero es valioso comprender la utilidad de |
534 |
distinguir entre la jerarquía primaria en un directorio root y la |
535 |
jerarquía secundaria en <path>/usr</path>. |
536 |
</p> |
537 |
|
538 |
<p> |
539 |
Esto es todo lo que veremos acerca del Estándar de la Jerarquía del |
540 |
Sistema de Archivos. El documento mismo es bastante fácil de leer, |
541 |
así que debería de darle un vistazo. Si lo lee, comprenderá mucho más |
542 |
acerca del sistema de archivos Linux. Puede encontrarlo en |
543 |
<uri>http://www.pathname.com/fhs/</uri>. |
544 |
</p> |
545 |
|
546 |
</body> |
547 |
</section> |
548 |
<section> |
549 |
<title>Búsqueda de archivos</title> |
550 |
<body> |
551 |
|
552 |
<p> |
553 |
Los sistemas frecuentemente contienen cientos de miles de archivos. |
554 |
Tal vez tiene la experiencia suficiente para no perderles el rastro, |
555 |
pero es probable que ocasionalmente necesite ayuda para encontrar |
556 |
alguno. Existen algunas herramientas en Linux para encontrar |
557 |
archivos. Esta introducción le ayudará a elegir la herramienta |
558 |
adecuada para este trabajo. |
559 |
</p> |
560 |
|
561 |
</body> |
562 |
</section> |
563 |
<section> |
564 |
<title>El PATH</title> |
565 |
<body> |
566 |
|
567 |
<p> |
568 |
Cuando ejecuta un programa en la línea de comandos, bash en realidad |
569 |
busca dentro de una lista de directorios para encontrar el programa |
570 |
que solicitó. Por ejemplo cuando teclea <c>ls</c>, <c>bash</c> |
571 |
intrínsecamente desconoce que el programa ls vive en <path>/usr/bin |
572 |
</path>. En cambio, bash hace referencia a una variable llamada PATH, |
573 |
la cual es una lista de directorios separada por dos puntos (:). |
574 |
Podemos examinar el valor de PATH: |
575 |
</p> |
576 |
|
577 |
<pre caption="Viendo PATH"> |
578 |
$ <i>echo $PATH</i> |
579 |
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin |
580 |
</pre> |
581 |
|
582 |
<p> |
583 |
Considerando este valor de PATH (el suyo puede ser diferente), bash |
584 |
revisará primero <path>/usr/local/bin</path>, luego |
585 |
<path>/usr/bin</path> en búsqueda del programa <c>ls</c>. Lo más |
586 |
probable es que <c>ls</c> se encuentre en <path>/usr/bin</path>, por |
587 |
lo que bash se detendrá en ese punto. |
588 |
</p> |
589 |
|
590 |
</body> |
591 |
</section> |
592 |
<section> |
593 |
<title>Modificando PATH</title> |
594 |
<body> |
595 |
|
596 |
<p> |
597 |
Puede aumentar su PATH asignándolo en la línea de comandos: |
598 |
</p> |
599 |
|
600 |
<pre caption="Editando PATH"> |
601 |
$ <i>PATH=$PATH:~/bin</i> |
602 |
$ <i>echo $PATH</i> |
603 |
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/home/yo/bi |
604 |
n |
605 |
</pre> |
606 |
|
607 |
<p> |
608 |
También puede eliminar elementos de PATH, aunque no es tan fácil |
609 |
porque no puede hacer referencia al $PATH existente. Lo mejor es |
610 |
simplemente escribir el nuevo PATH que desea: |
611 |
</p> |
612 |
|
613 |
<pre caption="Eliminando entradas de PATH"> |
614 |
$ <i>PATH=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:~/bin</i> |
615 |
$ <i>echo $PATH</i> |
616 |
/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/agriffis/bin |
617 |
</pre> |
618 |
|
619 |
<p> |
620 |
Para hacer que sus cambios en PATH estén disponibles para cualquier |
621 |
proceso futuro puede comenzar en esta interfaz de comandos, exportar |
622 |
sus cambios utilizando el comando export: |
623 |
</p> |
624 |
|
625 |
<pre caption="Exportando PATH (o cualquier variable, para el mismo caso)"> |
626 |
$ <i>export PATH</i> |
627 |
</pre> |
628 |
|
629 |
</body> |
630 |
</section> |
631 |
<section> |
632 |
<title>Todo sobre "which"</title> |
633 |
<body> |
634 |
|
635 |
<p> |
636 |
Puede revisar si existe un programa dado en PATH utilizando <c>which</c>. |
637 |
Por ejemplo, aquí nos encontramos con que nuestro sistema Linux |
638 |
no tiene sentido (común): |
639 |
</p> |
640 |
|
641 |
<pre caption="Buscando sentido"> |
642 |
$ which <i>sentido</i> |
643 |
which: no sentido in |
644 |
(/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin) |
645 |
</pre> |
646 |
|
647 |
<p> |
648 |
En este ejemplo, encontramos <c>ls</c>: |
649 |
</p> |
650 |
|
651 |
<pre caption="Buscando ls"> |
652 |
$ <i>which ls</i> |
653 |
/usr/bin/ls |
654 |
</pre> |
655 |
|
656 |
</body> |
657 |
</section> |
658 |
<section> |
659 |
<title>"which -a"</title> |
660 |
<body> |
661 |
|
662 |
<p> |
663 |
Finalmente, debe saber que la bandera <c>-a</c>, ocasiona que |
664 |
<c>which</c> le muestre todas las instancias de un programa determinado |
665 |
en su PATH: |
666 |
</p> |
667 |
|
668 |
<pre caption="Encontrando todas las instancias de un programa en su PATH"> |
669 |
$ <i>which -a ls</i> |
670 |
/usr/bin/ls |
671 |
/bin/ls |
672 |
</pre> |
673 |
|
674 |
</body> |
675 |
</section> |
676 |
<section> |
677 |
<title>whereis</title> |
678 |
<body> |
679 |
|
680 |
<p> |
681 |
Si está interesado en conocer más información de un programa en lugar |
682 |
de su simple ubicación, puede probar el programa <c>whereis</c>: |
683 |
</p> |
684 |
|
685 |
<pre caption="Uso de whereis"> |
686 |
$ <i>whereis ls</i> |
687 |
ls: /bin/ls /usr/bin/ls /usr/share/man/man1/ls.1.gz |
688 |
</pre> |
689 |
|
690 |
<p> |
691 |
Podemos ver que <c>ls</c> aparece en dos lugares binarios comunes, |
692 |
<path>/bin</path> y <path>/usr/bin</path>. Adicionalmente, estamos |
693 |
informados de que existe una página de manual localizada en |
694 |
<path>/usr/share/man</path>. Esta es la página del manual que vería si |
695 |
teclea <c>man ls</c>. |
696 |
</p> |
697 |
|
698 |
<p> |
699 |
El programa <c>whereis</c> también tiene la habilidad de buscar |
700 |
fuentes, especificar rutas de búsqueda alternativas y buscar entradas |
701 |
inusuales. Consulte la página del manual para más información. |
702 |
</p> |
703 |
|
704 |
</body> |
705 |
</section> |
706 |
<section> |
707 |
<title>find</title> |
708 |
<body> |
709 |
|
710 |
<p> |
711 |
La orden <c>find</c> es otra herramienta útil para su caja de |
712 |
herramientas. Con find no está limitado solo a programas; puede buscar |
713 |
cualquier archivo que desee, utilizando una variedad de criterios de |
714 |
búsqueda. Por ejemplo, para buscar un archivo de nombre LEEME, que |
715 |
comienza en <path>/usr/share/doc</path>: |
716 |
</p> |
717 |
|
718 |
<pre caption="Using find"> |
719 |
$ <i>find /usr/share/doc -name LEEME</i> |
720 |
/usr/share/doc/ion-20010523/LEEME |
721 |
/usr/share/doc/bind-9.1.3-r6/dhcp-dynamic-dns-examples/LEEME |
722 |
/usr/share/doc/sane-1.0.5/LEEME |
723 |
</pre> |
724 |
|
725 |
</body> |
726 |
</section> |
727 |
<section> |
728 |
<title>find y comodines</title> |
729 |
<body> |
730 |
|
731 |
<p> |
732 |
Puede usar los comodines de "englobamiento" en el argumento -name, |
733 |
siempre que los encierre entre comillas o barras invertidas (así son |
734 |
buscados intactos y no son ampliados por bash). Por ejemplo, puede |
735 |
que quiera buscar archivos LEEME con extensiones: |
736 |
</p> |
737 |
|
738 |
<pre caption="Uso de find con comodines"> |
739 |
$ <i>find /usr/share/doc -name LEEME\*</i> |
740 |
/usr/share/doc/iproute2-2.4.7/LEEME.gz |
741 |
/usr/share/doc/iproute2-2.4.7/LEEME.iproute2+tc.gz |
742 |
/usr/share/doc/iproute2-2.4.7/LEEME.decnet.gz |
743 |
/usr/share/doc/iproute2-2.4.7/examples/diffserv/LEEME.gz |
744 |
/usr/share/doc/pilot-link-0.9.6-r2/LEEME.gz |
745 |
/usr/share/doc/gnome-pilot-conduits-0.8/LEEME.gz |
746 |
/usr/share/doc/gimp-1.2.2/LEEME.i18n.gz |
747 |
/usr/share/doc/gimp-1.2.2/LEEME.win32.gz |
748 |
/usr/share/doc/gimp-1.2.2/LEEME.gz |
749 |
/usr/share/doc/gimp-1.2.2/LEEME.perl.gz |
750 |
[578 líneas adicionales omitidas] |
751 |
</pre> |
752 |
|
753 |
</body> |
754 |
</section> |
755 |
<section> |
756 |
<title>Ignorando distinción entre mayúsculas y minúsculas con find</title> |
757 |
<body> |
758 |
|
759 |
<p> |
760 |
Por supuesto, puede querer ignorar la distinción entre mayúsculas y |
761 |
minúsculas en su búsqueda: |
762 |
</p> |
763 |
|
764 |
<pre caption="Ignorando mayúsculas y minúsculas con find"> |
765 |
$ <i>find /usr/share/doc -name '[Ll][Ee][Ee][Mm][Ee]*'</i> |
766 |
</pre> |
767 |
|
768 |
<p> |
769 |
O, más simple: |
770 |
</p> |
771 |
|
772 |
<pre caption="Otro método"> |
773 |
$ <i>find /usr/share/doc -iname leeme\*</i> |
774 |
</pre> |
775 |
|
776 |
<p> |
777 |
Como puede ver, <c>-iname</c> realiza una búsqueda insensible a la |
778 |
distinción entre mayúsculas y minúsculas. |
779 |
</p> |
780 |
|
781 |
</body> |
782 |
</section> |
783 |
<section> |
784 |
<title>find y expresiones regulares</title> |
785 |
<body> |
786 |
|
787 |
<p> |
788 |
Si está familiarizado con expresiones regulares, puede utilizar la |
789 |
opción<c>-regex</c> para limitar los resultados a los nombres de archivos |
790 |
que coincidan con un patrón. Y similar a la opción <c>-iname</c>, |
791 |
existe un opción correspondiente <c>-iregex</c> que ignora la |
792 |
distinción entre mayúsculas y minúsculas en un patrón. Por ejemplo: |
793 |
</p> |
794 |
|
795 |
<pre caption="Expresiones regulares y find"> |
796 |
$ <i>find /etc -iregex '.*xt.*'</i> |
797 |
/etc/X11/xkb/types/extra |
798 |
/etc/X11/xkb/semantics/xtest |
799 |
/etc/X11/xkb/compat/xtest |
800 |
/etc/X11/app-defaults/XTerm |
801 |
/etc/X11/app-defaults/XTerm-color |
802 |
</pre> |
803 |
|
804 |
<p> |
805 |
Tenga en cuenta que <c>find</c> a diferencia de muchos programas, |
806 |
requiere que la expresión regular especificada coincida con la ruta |
807 |
completa, no solo una parte de ella. Por esa razón, es necesario |
808 |
especificar el .* anterior y posterior; con simplemente xt como |
809 |
expresión regular no sería suficiente. |
810 |
</p> |
811 |
|
812 |
</body> |
813 |
</section> |
814 |
<section> |
815 |
<title>find y tipos</title> |
816 |
<body> |
817 |
|
818 |
<p> |
819 |
La opción <c>-type</c> le permite encontrar objetos del sistema de |
820 |
archivos de un cierto tipo. Los argumentos posibles para -type son |
821 |
<c>b</c> (dispositivo de bloques), <c>c</c> (dispositivo de caracteres), |
822 |
<c>d</c> (directorio), <c>p</c> (tubería con nombre), <c>f</c> |
823 |
(archivo regular), <c>l</c> (enlace simbólico), y <c>s</c> (socket). |
824 |
Por ejemplo, para buscar archivos simbólicos en <path>/usr/bin</path> |
825 |
que contengan la cadena vim: |
826 |
</p> |
827 |
|
828 |
<pre caption="Restringiendo find con tipos"> |
829 |
$ <i>find /usr/bin -name '*vim*' -type l</i> |
830 |
/usr/bin/rvim |
831 |
/usr/bin/vimdiff |
832 |
/usr/bin/gvimdiff |
833 |
</pre> |
834 |
|
835 |
</body> |
836 |
</section> |
837 |
<section> |
838 |
<title>find y mtimes (tiempo de la última modificación)</title> |
839 |
<body> |
840 |
|
841 |
<p> |
842 |
La opción <c>-mtime</c> le permite seleccionar archivos basada en el |
843 |
tiempo de su última modificación. El argumento para mtime está dado |
844 |
en periodos de 24 horas, y es más útil cuando se utiliza un signo más |
845 |
(que significa "después") o un signo menos (que significa "antes". |
846 |
Por ejemplo, consideremos el siguiente escenario: |
847 |
</p> |
848 |
|
849 |
<pre caption="Escenario"> |
850 |
$ <i>ls -l ?</i> |
851 |
-rw------- 1 root root 0 Jan 7 18:00 a |
852 |
-rw------- 1 root root 0 Jan 6 18:00 b |
853 |
-rw------- 1 root root 0 Jan 5 18:00 c |
854 |
-rw------- 1 root root 0 Jan 4 18:00 d |
855 |
$ <i>date</i> |
856 |
Mon May 7 18:14:52 EST 2003 |
857 |
</pre> |
858 |
|
859 |
<p> |
860 |
Puede buscar archivos que hayan sido creados en las últimas 24 horas: |
861 |
</p> |
862 |
|
863 |
<pre caption="Archivos creados en las últimas 24 horas"> |
864 |
$ <i>find . -name \? -mtime -1</i> |
865 |
./a |
866 |
</pre> |
867 |
|
868 |
<p> |
869 |
O puede buscar archivos que hayan sido creados antes del actual |
870 |
periodo de 24 horas: |
871 |
</p> |
872 |
|
873 |
<pre caption="Archivos creados antes de las últimas 24 horas"> |
874 |
$ <i>find . -name \? -mtime +0</i> |
875 |
./b |
876 |
./c |
877 |
./d |
878 |
</pre> |
879 |
|
880 |
</body> |
881 |
</section> |
882 |
<section> |
883 |
<title>La opción -daystart</title> |
884 |
<body> |
885 |
|
886 |
<p> |
887 |
Si adicionalmente especifica la opción <c>-daystart</c>, entonces los |
888 |
periodos de tiempo inician al comienzo del día actual en lugar de 24 |
889 |
horas atrás. Por ejemplo, aquí se muestra un conjunto de archivos |
890 |
creados ayer y anteayer. |
891 |
</p> |
892 |
|
893 |
<pre caption="Usando -daystart"> |
894 |
$ <i>find . -name \? -daystart -mtime +0 -mtime -3</i> |
895 |
./b |
896 |
./c |
897 |
$ ls -l b c |
898 |
-rw------- 1 root root 0 May 6 18:00 b |
899 |
-rw------- 1 root root 0 May 5 18:00 c |
900 |
</pre> |
901 |
|
902 |
</body> |
903 |
</section> |
904 |
<section> |
905 |
<title>La opción -size</title> |
906 |
<body> |
907 |
|
908 |
<p> |
909 |
La opción <c>-size</c> le permite buscar archivos basados en su |
910 |
tamaño. De forma predeterminada el argumento de <c>-size</c> es de |
911 |
bloques de 512 bytes, pero agregando un sufijo puede ser más sencillo. |
912 |
Los sufijos disponibles son <c>b</c> (bloques de 512 bytes), <c>c</c> |
913 |
(bytes), <c>k</c> (kilobytes), y <c>w</c> (palabras de 2 bytes). |
914 |
Además, puede anteponer un signo más ("mayor que") o un signo menos |
915 |
("menor que"). |
916 |
</p> |
917 |
|
918 |
<p> |
919 |
Por ejemplo para buscar archivos regulares en <path>/usr/bin</path> |
920 |
que son más pequeños que 50 bytes: |
921 |
</p> |
922 |
|
923 |
<pre caption="-size en acción"> |
924 |
$ <i>find /usr/bin -type f -size -50c</i> |
925 |
/usr/bin/krdb |
926 |
/usr/bin/run-nautilus |
927 |
/usr/bin/sgmlwhich |
928 |
/usr/bin/muttbug |
929 |
</pre> |
930 |
|
931 |
</body> |
932 |
</section> |
933 |
<section> |
934 |
<title>Procesamiento de los archivos encontrados</title> |
935 |
<body> |
936 |
|
937 |
<p> |
938 |
¡Tal vez se esté preguntando qué puede hacer con todos los archivos |
939 |
que ha encontrado! Bueno, <c>find</c> tiene la habilidad de actuar |
940 |
sobre los archivos que encuentra usando la opción <c>-exec</c>. Esta |
941 |
opción acepta una línea de comandos para ejecutarse como su |
942 |
argumento, terminado con ;, y reemplaza cualquier ocurrencia de {} |
943 |
con el nombre del archivo. Esto se entiende mejor con un ejemplo: |
944 |
</p> |
945 |
|
946 |
<pre caption="Uso de -exec"> |
947 |
$ <i>find /usr/bin -type f -size -50c -exec ls -l '{}' ';'</i> |
948 |
-rwxr-xr-x 1 root root 27 Oct 28 07:13 /usr/bin/krdb |
949 |
-rwxr-xr-x 1 root root 35 Nov 28 18:26 /usr/bin/run-nautilus |
950 |
-rwxr-xr-x 1 root root 25 Oct 21 17:51 /usr/bin/sgmlwhich |
951 |
-rwxr-xr-x 1 root root 26 Sep 26 08:00 /usr/bin/muttbug |
952 |
</pre> |
953 |
|
954 |
<p> |
955 |
Como puede ver, <c>find</c> es una orden muy poderosa. Ha crecido a |
956 |
través de los años de UNIX y el desarrollo de Linux. Hay muchas más |
957 |
opciones útiles para realizar búsquedas. Puede aprender más acerca de |
958 |
ellas en la página del manual find. |
959 |
</p> |
960 |
|
961 |
</body> |
962 |
</section> |
963 |
<section> |
964 |
<title>locate</title> |
965 |
<body> |
966 |
|
967 |
<p> |
968 |
Hemos cubierto <c>which</c>, <c>whereis</c>, y <c>find</c>. Tal vez |
969 |
haya notado que <c>find</c> puede tomar un tiempo en ejecutarse, ya |
970 |
que necesita leer cada directorio que está buscando. Resulta entonces |
971 |
que la orden <c>locate</c> puede acelerar las cosas apoyándose en una |
972 |
base de datos externa generada por <c>updatedb</c> (la cual trataremos |
973 |
en el siguiente panel). |
974 |
</p> |
975 |
|
976 |
<p> |
977 |
La orden <c>locate</c> puede encontrar una coincidencia con cualquier |
978 |
parte del nombre de la ruta, no solo con el nombre del archivo. Por |
979 |
ejemplo: |
980 |
</p> |
981 |
|
982 |
<pre caption="locate en acción"> |
983 |
$ <i>locate bin/ls</i> |
984 |
/var/ftp/bin/ls |
985 |
/bin/ls |
986 |
/sbin/lsmod |
987 |
/sbin/lspci |
988 |
/usr/bin/lsattr |
989 |
/usr/bin/lspgpot |
990 |
/usr/sbin/lsof |
991 |
</pre> |
992 |
|
993 |
</body> |
994 |
</section> |
995 |
<section> |
996 |
<title>Uso de updatedb</title> |
997 |
<body> |
998 |
|
999 |
<p> |
1000 |
La mayoría de los sistemas Linux tiene un "trabajo programado" para |
1001 |
actualizar la base de datos periódicamente. Si su <c>locate</c> |
1002 |
devuelve un error como el siguiente, entonces debe ejecutar como |
1003 |
usuario root <c>updatedb</c> para generar la base de datos de búsqueda: |
1004 |
</p> |
1005 |
|
1006 |
<pre caption="Actualizando su base de datos locate"> |
1007 |
$ <i>locate bin/ls</i> |
1008 |
locate: /var/spool/locate/locatedb: No such file or directory |
1009 |
$ <i>su -</i> |
1010 |
Password: |
1011 |
# <i>updatedb</i> |
1012 |
</pre> |
1013 |
|
1014 |
<p> |
1015 |
La orden <c>updatedb</c> puede tomar mucho tiempo en ejecutarse. Si |
1016 |
tiene un disco duro ruidoso, escuchará una gran cantidad de ruidos |
1017 |
mientras que el sistema de archivos entero es indexado. :) |
1018 |
</p> |
1019 |
|
1020 |
|
1021 |
</body> |
1022 |
</section> |
1023 |
<section> |
1024 |
<title>mlocate</title> |
1025 |
<body> |
1026 |
|
1027 |
<p> |
1028 |
En muchas distribuciones Linux, la orden <c>locate</c> ha sido |
1029 |
reemplazada por <c>mlocate</c>. Normalmente existe un enlace |
1030 |
simbólico a <c>locate</c>, de modo que no es necesario recordar cual |
1031 |
tiene. <c>mlocate</c> viene de "localización segura". Almacena |
1032 |
información de permisos en la base de datos de manera que los |
1033 |
usuarios normales no pueden inmiscuirse en directorios que, de algún |
1034 |
otro modo, serían incapaces de leer. El uso de la información para |
1035 |
<c>mlocate</c> es esencialmente la misma que para <c>locate</c>, |
1036 |
aunque la salida puede ser diferente dependiendo del usuario que |
1037 |
ejecuta los comandos. |
1038 |
</p> |
1039 |
|
1040 |
</body> |
1041 |
</section> |
1042 |
</chapter> |
1043 |
<chapter> |
1044 |
<title>Control de procesos</title> |
1045 |
<section> |
1046 |
<title>Iniciando xeyes</title> |
1047 |
<body> |
1048 |
|
1049 |
<p> |
1050 |
Para aprender acerca de control de procesos, primero tenemos que |
1051 |
iniciar un proceso. Asegúrese que está utilizando X y ejecute la |
1052 |
siguiente orden: |
1053 |
</p> |
1054 |
|
1055 |
<pre caption="Iniciando un proceso"> |
1056 |
$ <i>xeyes -center red</i> |
1057 |
</pre> |
1058 |
|
1059 |
<p> |
1060 |
Habrá notado que una ventana xeyes apareció, y que los globos |
1061 |
oculares rojos siguen su ratón por la pantalla. Además habrá notado |
1062 |
que no tiene un nuevo prompt en su terminal. |
1063 |
</p> |
1064 |
|
1065 |
</body> |
1066 |
</section> |
1067 |
<section> |
1068 |
<title>Deteniendo un proceso</title> |
1069 |
<body> |
1070 |
|
1071 |
<p> |
1072 |
Para tener de nuevo el prompt, puede teclear Control-C (a menudo |
1073 |
escrito como Crtl-C o ^C): |
1074 |
</p> |
1075 |
|
1076 |
<p> |
1077 |
De nuevo tiene un prompt bash, pero la ventana xeyes desapareció. De |
1078 |
hecho el proceso entero fue terminado. En lugar de terminarlo con |
1079 |
Control-C, podemos solamente detenerlo con Control-Z: |
1080 |
</p> |
1081 |
|
1082 |
<pre caption="Deteniendo un proceso"> |
1083 |
$ <i>xeyes -center red</i> |
1084 |
<i>Control-Z</i> |
1085 |
[1]+ Stopped xeyes -center red |
1086 |
$ |
1087 |
</pre> |
1088 |
|
1089 |
<p> |
1090 |
En este momento tiene un nuevo prompt bash, y la ventana xeyes se |
1091 |
mantiene arriba. Sin embargo, si juega un poco con ella, notará que |
1092 |
los globos oculares están estáticos. Si la ventana xeyes es cubierta |
1093 |
por otra ventana y después descubierta de nuevo, notará que ni |
1094 |
siquiera se han redibujado lo ojos. El proceso no está haciendo nada. |
1095 |
De hecho, está "Detenido". |
1096 |
</p> |
1097 |
|
1098 |
</body> |
1099 |
</section> |
1100 |
<section> |
1101 |
<title>fg y bg</title> |
1102 |
<body> |
1103 |
|
1104 |
<p> |
1105 |
Para tener el proceso "no-detenido" y ejecutándose nuevamente, |
1106 |
podemos traerlo al primer plano con el bash incorporado <c>fg</c>: |
1107 |
</p> |
1108 |
|
1109 |
<pre caption="Usando fg"> |
1110 |
$ <i>fg</i> |
1111 |
<comment>(pruébelo, luego detenga el proceso de nuevo)</comment> |
1112 |
<i>Control-Z</i> |
1113 |
[1]+ Stopped xeyes -center red |
1114 |
$ |
1115 |
</pre> |
1116 |
|
1117 |
<p> |
1118 |
Ahora continúelo en el segundo plano con el bash incorporado <c>bg</c>: |
1119 |
</p> |
1120 |
|
1121 |
<pre caption="Usando bg"> |
1122 |
$ <i>bg</i> |
1123 |
[1]+ xeyes -center red & |
1124 |
$ |
1125 |
</pre> |
1126 |
|
1127 |
<p> |
1128 |
¡Muy bien! El proceso xeyes está ahora ejecutándose en el segundo |
1129 |
plano, y tenemos de nuevo, un prompt bash trabajando. |
1130 |
</p> |
1131 |
|
1132 |
</body> |
1133 |
</section> |
1134 |
<section> |
1135 |
<title>Uso de "&"</title> |
1136 |
<body> |
1137 |
|
1138 |
<p> |
1139 |
Si deseamos iniciar xeyes en segundo plano dese el inicio (en lugar |
1140 |
de usar Control-Z y bg), podemos agregar un "&" (signo &) al |
1141 |
final de xeyes en la línea de comando: |
1142 |
</p> |
1143 |
|
1144 |
<pre caption="Usando & para ejecutar procesos en segundo plano "> |
1145 |
$ <i>xeyes -center blue &</i> |
1146 |
[2] 16224 |
1147 |
</pre> |
1148 |
|
1149 |
</body> |
1150 |
</section> |
1151 |
<section> |
1152 |
<title>Múltiples procesos en segundo plano</title> |
1153 |
<body> |
1154 |
|
1155 |
<p> |
1156 |
Ahora tenemos xeyes rojos y azules ambos ejecutándose en segundo |
1157 |
plano. Podemos listar estos trabajos con el bash incorporado |
1158 |
<c>jobs</c>: |
1159 |
</p> |
1160 |
|
1161 |
<pre caption="Uso de jobs"> |
1162 |
$ <i>jobs -l</i> |
1163 |
[1]- 16217 Running xeyes -center red & |
1164 |
[2]+ 16224 Running xeyes -center blue & |
1165 |
</pre> |
1166 |
|
1167 |
<p> |
1168 |
Los números en la columna izquierda son los números asignados por |
1169 |
bash cuando fueron iniciados. El trabajo 2 tiene un + (más) para |
1170 |
indicar que este es el "trabajo actual", lo cual significa que |
1171 |
escribiendo <c>fg</c> lo traeremos al primer plano. Puede también |
1172 |
traer a primer plano un trabajo especificando su número; por ejemplo |
1173 |
<c>fg</c> hará a xeyes rojos la tarea de primer plano. La siguiente |
1174 |
columna es el identificador de proceso o pid, incluido en la lista |
1175 |
cortesía de la opción -l de jobs. Finalmente, ambos trabajos estan |
1176 |
actualmente "ejecutándose", y sus líneas de comando son mencionadas a |
1177 |
la derecha. |
1178 |
</p> |
1179 |
|
1180 |
</body> |
1181 |
</section> |
1182 |
<section> |
1183 |
<title>Introducción a señales</title> |
1184 |
<body> |
1185 |
|
1186 |
<p> |
1187 |
Para terminar, detener o continuar procesos, Linux usa una forma |
1188 |
especial de comunicación llamada "señales". Enviando cierto tipo de |
1189 |
señal a un proceso, puede terminarlo, detenerlo, o hacer otras cosas. |
1190 |
Esto es lo que en realidad hace cuando escribe Control-C, Control-Z o |
1191 |
utiliza los incorporados <c>bg</c> o <c>fg</c> -- está usando bash |
1192 |
para enviar una señal en particular a el proceso. Estas señales |
1193 |
pueden ser enviadas también usando la orden <c>kill</c> y |
1194 |
especificando el pid (identificador de proceso) en la línea de comandos: |
1195 |
</p> |
1196 |
|
1197 |
<pre caption="Uso de kill"> |
1198 |
$ <i>kill -s SIGSTOP 16224</i> |
1199 |
$ <i>jobs -l</i> |
1200 |
[1]- 16217 Running xeyes -center red & |
1201 |
[2]+ 16224 Stopped (signal) xeyes -center blue |
1202 |
</pre> |
1203 |
|
1204 |
<p> |
1205 |
Como puede ver, kill no necesariamente "mata" un proceso, aunque |
1206 |
puede. Usando la opción "-s", <c>kill</c> puede enviar cualquier |
1207 |
señal a un proceso. Linux termina, detiene o continúa procesos cuando |
1208 |
son enviadas las señales SIGINT, SIGSTOP, o SIGCONT respectivamente. |
1209 |
También existen otras señales que puede enviar a un proceso; algunas |
1210 |
de estas señales pueden ser interpretadas de un modo dependiente de |
1211 |
la aplicación. Puede aprender que señales reconoce un proceso en |
1212 |
particular mirando la página del manual y buscando la sección SIGNALS. |
1213 |
</p> |
1214 |
|
1215 |
</body> |
1216 |
</section> |
1217 |
<section> |
1218 |
<title>SIGTERM y SIGINT</title> |
1219 |
<body> |
1220 |
|
1221 |
<p> |
1222 |
Si desea terminar un proceso, tiene muchas opciones. De manera |
1223 |
predeterminada, kill envía SIGTERM, que no es idéntico al famoso |
1224 |
SIGINT de Control-C, pero usualmente tiene los mismos resultados: |
1225 |
</p> |
1226 |
|
1227 |
<pre caption="Usando kill para terminar un proceso"> |
1228 |
$ <i>kill 16217</i> |
1229 |
$ <i>jobs -l</i> |
1230 |
[1]- 16217 Terminated xeyes -center red |
1231 |
[2]+ 16224 Stopped (signal) xeyes -center blue |
1232 |
</pre> |
1233 |
|
1234 |
</body> |
1235 |
</section> |
1236 |
<section> |
1237 |
<title>El gran kill</title> |
1238 |
<body> |
1239 |
|
1240 |
<p> |
1241 |
Los procesos pueden ignorar tanto SIGTERM como SIGINT, ya sea por |
1242 |
elección o porque están detenidos o de alguna manera "atascados". En |
1243 |
estos casos puede ser necesario utilizar artillería pesada, la señal |
1244 |
SIGKILL. Un proceso no puede ignorar SIGKILL: |
1245 |
</p> |
1246 |
|
1247 |
<pre caption="Usando kill para destruir un proceso"> |
1248 |
$ <i>kill 16224</i> |
1249 |
$ <i>jobs -l</i> |
1250 |
[2]+ 16224 Stopped (signal) xeyes -center blue |
1251 |
$ <i>kill -s SIGKILL</i> |
1252 |
$ <i>jobs -l</i> |
1253 |
[2]+ 16224 Interrupt xeyes -center blue |
1254 |
</pre> |
1255 |
|
1256 |
</body> |
1257 |
</section> |
1258 |
<section> |
1259 |
<title>nohup</title> |
1260 |
<body> |
1261 |
|
1262 |
<p> |
1263 |
La terminal donde inicia un trabajo es llamada la terminal |
1264 |
controladora del trabajo. Algunas interfaces de comandos (no bash por |
1265 |
omisión), enviarán una señal SIGHUP para enviar a segundo plano |
1266 |
trabajos cuando cierre sesión, ocasionando que terminen. Para |
1267 |
proteger procesos de este comportamiento, use nohup cuando inicie un |
1268 |
proceso: |
1269 |
</p> |
1270 |
|
1271 |
<pre caption="nohup en acción"> |
1272 |
$ <i>nohup make &</i> |
1273 |
[1] 15632 |
1274 |
$ <i>exit</i> |
1275 |
</pre> |
1276 |
|
1277 |
</body> |
1278 |
</section> |
1279 |
<section> |
1280 |
<title>Uso de ps para listar procesos</title> |
1281 |
<body> |
1282 |
|
1283 |
<p> |
1284 |
La orden <c>jobs</c> que usamos anteriormente solo lista los procesos |
1285 |
que fueron iniciados desde su sesión de bash. Para ver todos los |
1286 |
procesos de su sistema, use <c>ps</c> con las opciones <c>a</c> y <c>x</c> |
1287 |
juntas: |
1288 |
</p> |
1289 |
|
1290 |
<pre caption="ps con ax"> |
1291 |
$ <i>ps ax</i> |
1292 |
PID TTY STAT TIME COMMAND |
1293 |
1 ? S 0:04 init [3] |
1294 |
2 ? SW 0:11 [keventd] |
1295 |
3 ? SWN 0:13 [ksoftirqd_CPU0] |
1296 |
4 ? SW 2:33 [kswapd] |
1297 |
5 ? SW 0:00 [bdflush] |
1298 |
</pre> |
1299 |
|
1300 |
<p> |
1301 |
Solo fueron listados los primeros porque usualmente es una lista muy |
1302 |
larga. Esto le da una idea rápida de que está haciendo la máquina, |
1303 |
pero es mucha información para filtrar. Si deja fuera a <c>ax</c>, |
1304 |
solo verá los procesos que le pertenecen, y que tienen su control en |
1305 |
una terminal. La orden <c>ps x</c> le mostrará todos los procesos, incluso |
1306 |
aquellos que no son controlados por una terminal. Si usa <c>ps a</c>, |
1307 |
obtendrá una lista de todos los procesos que están unidos a una terminal. |
1308 |
</p> |
1309 |
|
1310 |
</body> |
1311 |
</section> |
1312 |
<section> |
1313 |
<title>Mirando el bosque y los árboles</title> |
1314 |
<body> |
1315 |
|
1316 |
<p> |
1317 |
Puede además listar información diferente acerca de cada proceso. La |
1318 |
opción <c>--forest</c> hace más fácil ver la jerarquía del proceso, |
1319 |
la cual le da una indicación de como se interrelacionan los diversos |
1320 |
procesos en su sistema. Cuando un proceso inicia un nuevo proceso, el |
1321 |
nuevo proceso es llamado proceso "hijo". En un listado de <c>--forest |
1322 |
</c>, los padres aparecen en la izquierda y los hijos aparecen como |
1323 |
ramas del lado derecho: |
1324 |
</p> |
1325 |
|
1326 |
<pre caption="Usando forest"> |
1327 |
$ <i>ps x --forest</i> |
1328 |
PID TTY STAT TIME COMMAND |
1329 |
927 pts/1 S 0:00 bash |
1330 |
6690 pts/1 S 0:00 \_ bash |
1331 |
26909 pts/1 R 0:00 \_ ps x --forest |
1332 |
19930 pts/4 S 0:01 bash |
1333 |
25740 pts/4 S 0:04 \_ vi processes.txt |
1334 |
</pre> |
1335 |
|
1336 |
</body> |
1337 |
</section> |
1338 |
<section> |
1339 |
<title>Las opciones "u" y "l" de ps</title> |
1340 |
<body> |
1341 |
|
1342 |
<p> |
1343 |
Las opciones <c>u</c> y <c>l</c> pueden ser agregadas a la |
1344 |
combinación de <c>a</c> y <c>x</c> con el objetivo de incluir más |
1345 |
información acerca de cada proceso: |
1346 |
</p> |
1347 |
|
1348 |
<pre caption="Opción au"> |
1349 |
$ <i>ps au</i> |
1350 |
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND |
1351 |
agriffis 403 0.0 0.0 2484 72 tty1 S 2001 0:00 -bash |
1352 |
chouser 404 0.0 0.0 2508 92 tty2 S 2001 0:00 -bash |
1353 |
root 408 0.0 0.0 1308 248 tty6 S 2001 0:00 /sbin/agetty 3 |
1354 |
agriffis 434 0.0 0.0 1008 4 tty1 S 2001 0:00 /bin/sh/usr/X |
1355 |
chouser 927 0.0 0.0 2540 96 pts/1 S 2001 0:00 bash |
1356 |
</pre> |
1357 |
|
1358 |
<pre caption="Opción al"> |
1359 |
$ <i>ps al</i> |
1360 |
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND |
1361 |
100 1001 403 1 9 0 2484 72 wait4 S tty1 0:00 -bash |
1362 |
100 1000 404 1 9 0 2508 92 wait4 S tty2 0:00 -bash |
1363 |
000 0 408 1 9 0 1308 248 read_c S tty6 0:00 /sbin/ag |
1364 |
000 1001 434 403 9 0 1008 4 wait4 S tty1 0:00 /bin/sh |
1365 |
000 1000 927 652 9 0 2540 96 wait4 S pts/1 0:00 bash |
1366 |
</pre> |
1367 |
|
1368 |
</body> |
1369 |
</section> |
1370 |
<section> |
1371 |
<title>Usando top</title> |
1372 |
<body> |
1373 |
|
1374 |
<p> |
1375 |
Si se encuentra ejecutando ps varias veces en fila, intentando ver |
1376 |
cambios, lo que probablemente quiera es <c>top</c>. <c>top</c> |
1377 |
despliega continuamente una lista actualizada de procesos, junto con |
1378 |
un resumen de información útil: |
1379 |
</p> |
1380 |
|
1381 |
<pre caption="top"> |
1382 |
$ <i>top</i> |
1383 |
10:02pm up 19 days, 6:24, 8 users, load average: 0.04, 0.05, 0.00 |
1384 |
75 processes: 74 sleeping, 1 running, 0 zombie, 0 stopped |
1385 |
CPU states: 1.3% user, 2.5% system, 0.0% nice, 96.0% idle |
1386 |
Mem: 256020K av, 226580K used, 29440K free, 0K shrd, 3804K buff |
1387 |
Swap: 136544K av, 80256K used, 56288K free 101760K |
1388 |
cached |
1389 |
|
1390 |
PID USER PRI NI SIZE RSS SHARE STAT LIB %CPU %MEM TIME COMMAND |
1391 |
628 root 16 0 213M 31M 2304 S 0 1.9 12.5 91:43 X |
1392 |
26934 chouser 17 0 1272 1272 1076 R 0 1.1 0.4 0:00 top |
1393 |
652 chouser 11 0 12016 8840 1604 S 0 0.5 3.4 3:52 gnome-termin |
1394 |
641 chouser 9 0 2936 2808 1416 S 0 0.1 1.0 2:13 sawfish |
1395 |
</pre> |
1396 |
|
1397 |
</body> |
1398 |
</section> |
1399 |
<section> |
1400 |
<title>nice</title> |
1401 |
<body> |
1402 |
|
1403 |
<p> |
1404 |
Cada proceso tiene una definición de prioridades que Linux utiliza |
1405 |
para determinar cómo son compartidas las porciones de tiempo del CPU. |
1406 |
Puede fijar la prioridad de un proceso iniciándolo con la orden <c>nice</c>: |
1407 |
</p> |
1408 |
|
1409 |
<pre caption="Un proceso con nice"> |
1410 |
$ <i>nice -n 10 oggenc /tmp/song.wav</i> |
1411 |
</pre> |
1412 |
|
1413 |
<p> |
1414 |
Dado que la definición de prioridad es llamada <c>nice</c>, debe ser |
1415 |
sencillo recordar que un valor mayor será mejor que otros procesos, |
1416 |
lo que les permite tener prioridad para acceder al CPU. De forma |
1417 |
predeterminada, los procesos inician con un valor de 0, por lo que el |
1418 |
darles un valor de 10 significa que oggenc le dará facilidad a otros |
1419 |
procesos en el CPU. En general, esto significa que oggenc le |
1420 |
permitirá a otros procesos funcionar a su velocidad normal, |
1421 |
independientemente de cómo sea el hambre de CPU de oggenc. Puede ver |
1422 |
los niveles mejorados en la columna NI en el ps y top listados arriba. |
1423 |
</p> |
1424 |
|
1425 |
</body> |
1426 |
</section> |
1427 |
<section> |
1428 |
<title>renice</title> |
1429 |
<body> |
1430 |
|
1431 |
<p> |
1432 |
La orden <c>nice</c> solo puede cambiar la prioridad de un proceso |
1433 |
cuando este se inicia. Si desea cambiar la definición de prioridad de |
1434 |
un proceso que está en ejecución, use <c>renice</c>: |
1435 |
</p> |
1436 |
|
1437 |
<pre caption="Usando renice"> |
1438 |
$ <i>ps l 641</i> |
1439 |
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND |
1440 |
000 1000 641 1 9 0 5876 2808 do_sel S ? 2:14 sawfish |
1441 |
$ <i>renice 10 641</i> |
1442 |
641: old priority 0, new priority 10 |
1443 |
$ <i>ps l 641</i> |
1444 |
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND |
1445 |
000 1000 641 1 9 10 5876 2808 do_sel S ? 2:14 sawfish |
1446 |
</pre> |
1447 |
|
1448 |
</body> |
1449 |
</section> |
1450 |
</chapter> |
1451 |
|
1452 |
<chapter> |
1453 |
<title>Procesamiento de texto</title> |
1454 |
<section> |
1455 |
<title>Redirección revisada</title> |
1456 |
<body> |
1457 |
|
1458 |
<p> |
1459 |
Anteriormente en esta serie de tutoriales, vimos un ejemplo de cómo |
1460 |
usar el operador <c>></c> para redireccionar la salida de una orden a |
1461 |
un archivo, como se muestra a continuación: |
1462 |
</p> |
1463 |
|
1464 |
<pre caption="Uso del operador >"> |
1465 |
$ <i>echo "primerarchivo" > copiame</i> |
1466 |
</pre> |
1467 |
|
1468 |
<p> |
1469 |
Además de redirigir una salida a un archivo, podemos tomar ventaja de |
1470 |
una poderosa característica de la interfaz de comandos llamada |
1471 |
tuberías. Con el uso de tuberías podemos pasar la salida de una orden |
1472 |
a la entrada de otra orden. Considere el siguiente ejemplo: |
1473 |
</p> |
1474 |
|
1475 |
<pre caption="Introducción a tuberías"> |
1476 |
$ <i>echo "hola" | wc</i> |
1477 |
1 2 9 |
1478 |
</pre> |
1479 |
|
1480 |
<p> |
1481 |
El carácter <c>|</c> es usado para conectar la salida de la orden de |
1482 |
la izquierda a la entrada de la orden de la derecha. En el ejemplo |
1483 |
de arriba, la orden <c>echo</c> imprime la cadena "hola" seguido de |
1484 |
un salto de línea. Esta salida normalmente aparecería en la terminal, |
1485 |
pero el tubo lo redirecciona a la orden <c>wc</c>, la cual despliega |
1486 |
el número de líneas, palabras y caracteres de su entrada. |
1487 |
</p> |
1488 |
|
1489 |
</body> |
1490 |
</section> |
1491 |
<section> |
1492 |
<title>Un ejemplo de tubería</title> |
1493 |
<body> |
1494 |
|
1495 |
<p> |
1496 |
Aquí está otro ejemplo simple: |
1497 |
</p> |
1498 |
|
1499 |
<pre caption="tuberías en acción"> |
1500 |
$ <i>ls -s | sort -n</i> |
1501 |
</pre> |
1502 |
|
1503 |
<p> |
1504 |
En este caso, <c>ls -s</c> normalmente imprimiría una lista del |
1505 |
directorio actual en la terminal, con cada archivo precedido por su |
1506 |
tamaño. Pero en su lugar enviamos por la tubería la salida a <c>sort -n</c>, |
1507 |
el cual ordena la salida numéricamente. ¡Esto es una manera |
1508 |
realmente útil de encontrar archivos grandes en su directorio home! |
1509 |
</p> |
1510 |
|
1511 |
<p> |
1512 |
Los siguientes ejemplos son más complejos, pero demuestran el poder |
1513 |
que puede ser aprovechado usando tuberías. Vamos a utilizar algunas |
1514 |
órdenes que no hemos cubierto aun, pero no deje que eso lo haga más |
1515 |
lento. Concéntrese en entender cómo funcionan las tuberías, así podrá |
1516 |
emplearlas en sus tareas Linux cotidianas. |
1517 |
</p> |
1518 |
|
1519 |
</body> |
1520 |
</section> |
1521 |
<section> |
1522 |
<title>La tubería de descompresión</title> |
1523 |
<body> |
1524 |
|
1525 |
<p> |
1526 |
Normalmente para descomprimir y desempaquetar un archivo, puede hacer |
1527 |
los siguiente: |
1528 |
</p> |
1529 |
|
1530 |
<pre caption="Desempaquetando un archivo"> |
1531 |
$ <i>bzip2 -d linux-2.4.16.tar.bz2</i> |
1532 |
$ <i>tar xvf linux-2.4.16.tar</i> |
1533 |
</pre> |
1534 |
|
1535 |
<p> |
1536 |
La desventaja de este método es que requiere de la creación de un |
1537 |
archivo intermediario y descomprimido en su disco. Dado que <c>tar</c> |
1538 |
tiene la habilidad de leer directamente desde su entrada (en lugar |
1539 |
de especificar un archivo), podemos producir el mismo resultado |
1540 |
usando una tubería: |
1541 |
</p> |
1542 |
|
1543 |
<pre caption="Desempaquetar usando una tubería"> |
1544 |
$ <i>bzip2 -dc linux-2.4.16.tar.bz2 | tar xvf -</i> |
1545 |
</pre> |
1546 |
|
1547 |
<p> |
1548 |
¡Hurra! Nuestro archivo tar comprimido se ha extraído y no hemos |
1549 |
necesitado de un archivo intermedio. |
1550 |
</p> |
1551 |
|
1552 |
</body> |
1553 |
</section> |
1554 |
<section> |
1555 |
<title>Una tubería más larga</title> |
1556 |
<body> |
1557 |
|
1558 |
<p> |
1559 |
Aquí está otro ejemplo de tubería: |
1560 |
</p> |
1561 |
|
1562 |
<pre caption="Tuberías más largas"> |
1563 |
$ <i>cat miarchivo.txt | sort | uniq | wc -l</i> |
1564 |
</pre> |
1565 |
|
1566 |
<p> |
1567 |
Usamos <c>cat</c> para enviar el contenido de <path>miarchivo.txt</path> |
1568 |
a la orden <c>sort</c>. Cuando la orden <c>sort</c> recibe la |
1569 |
entrada, ordena todas las líneas para que estén en orden alfabético, |
1570 |
y envía la salida a <c>uniq</c>. <c>uniq</c> elimina cualquier línea |
1571 |
duplicada (por cierto, requiere que la entrada esté ordenada) |
1572 |
enviando la salida que ya ha sido borrada a <c>wc -l</c>. Hemos visto |
1573 |
la orden <c>wc</c> anteriormente, pero sin las opciones de la línea |
1574 |
de comando. Cuando se da la opción <c>-l</c>, solamente imprime el |
1575 |
número de líneas en su entrada, en lugar de incluir también palabras |
1576 |
y caracteres. Como puede ver esta tubería imprime el número líneas |
1577 |
únicas (no idénticas) en un archivo de texto. |
1578 |
</p> |
1579 |
|
1580 |
<p> |
1581 |
Trate de crear un par de archivos de prueba con su editor de texto |
1582 |
favorito y utilice esta tubería para ver qué resultados obtiene. |
1583 |
</p> |
1584 |
|
1585 |
</body> |
1586 |
</section> |
1587 |
<section> |
1588 |
<title>El curso exprés de procesamiento de texto comienza</title> |
1589 |
<body> |
1590 |
|
1591 |
<p> |
1592 |
Ahora nos embarcamos en un viaje relámpago a las órdenes estándar |
1593 |
Linux de procesamiento de texto. Debido a que estamos cubriendo mucho |
1594 |
material en este tutorial, no tenemos el espacio para dar ejemplos de |
1595 |
cada orden. En cambio, lo animamos para que lea cada página del |
1596 |
manual de las ordenes (escribiendo <c>man echo</c>, por ejemplo) y |
1597 |
aprenda cada orden y como trabajan sus opciones jugando un rato con |
1598 |
cada una. Como regla, estas órdenes imprimen los resultados de |
1599 |
cualquier procesamiento a una terminal en vez de modificar algún |
1600 |
archivo. Después de haber tomado nuestro un viaje relámpago a las |
1601 |
órdenes estándar Linux de procesamiento de texto, veremos más de |
1602 |
cerca la redirección de la salida y entrada. Así que sí, hay una luz |
1603 |
al final del túnel :). |
1604 |
</p> |
1605 |
|
1606 |
<p> |
1607 |
<c>echo</c> imprime sus argumentos a la terminal. Use la opción <c>-e</c> |
1608 |
si quiere integrar secuencias de escape con la barra invertida; |
1609 |
por ejemplo <c>echo -e "foo\nfoo"</c> imprimirá foo, luego un salto |
1610 |
de línea y después foo otra vez. Use la opción <c>-n</c> para decirle |
1611 |
a echo que omita el salto de línea final que es anexado a la salida |
1612 |
por defecto. |
1613 |
</p> |
1614 |
|
1615 |
<p> |
1616 |
<c>cat</c> imprimirá en la terminal el contenido de los archivos |
1617 |
especificados como argumentos. Es útil como primer comando de una |
1618 |
tubería, por ejemplo, <c>cat foo.txt | bla</c>. |
1619 |
</p> |
1620 |
|
1621 |
<p> |
1622 |
<c>sort</c> imprimirá el contenido de un archivo especificado en la |
1623 |
línea de comandos en orden alfabético. Por supuesto, <c>sort</c> |
1624 |
también acepta entradas desde una tubería. Escriba <c>man sort</c> |
1625 |
para familiarizarse con las diversas opciones que controlan la |
1626 |
conducta del ordenamiento. |
1627 |
</p> |
1628 |
|
1629 |
<p> |
1630 |
<c>uniq</c> toma un archivo <e>ya ordenado</e> o una secuencia de |
1631 |
datos (a través de una tubería) y elimina las líneas duplicadas. |
1632 |
</p> |
1633 |
|
1634 |
<p> |
1635 |
<c>wc</c> imprime el número de líneas, palabras y bytes en un archivo |
1636 |
determinado o en la secuencia de entrada (de una tubería). Escriba |
1637 |
<c>man wc</c> para aprender como ajustar los resultados que son |
1638 |
desplegados. |
1639 |
</p> |
1640 |
|
1641 |
<p> |
1642 |
<c>head</c> imprime las primeras diez líneas de un archivo o una |
1643 |
secuencia. Use la opción <c>-n</c> para especificar cuantas líneas se |
1644 |
desea mostrar. |
1645 |
</p> |
1646 |
|
1647 |
<p> |
1648 |
<c>tail</c> imprime las últimas diez líneas de un archivo o |
1649 |
secuencia. Use la opción <c>-n</c> para especificar cuantas líneas se |
1650 |
desea mostrar. |
1651 |
</p> |
1652 |
|
1653 |
<p> |
1654 |
<c>tac</c> es como <c>cat</c>, pero imprime todas las líneas en orden |
1655 |
inverso; en otras palabras, la última línea se imprime primero. |
1656 |
</p> |
1657 |
|
1658 |
<p> |
1659 |
<c>expand</c> convierte las tabulaciones en espacios. Use la opción |
1660 |
<c>-t</c> para especificar la posición del tabulador. |
1661 |
</p> |
1662 |
|
1663 |
<p> |
1664 |
<c>unexpand</c> convierte los espacios de entrada en tabulaciones. |
1665 |
Use la opción <c>-t</c> para especificar la posición del tabulador. |
1666 |
</p> |
1667 |
|
1668 |
<p> |
1669 |
<c>cut</c> es usado para extraer campos delimitados por caracteres de |
1670 |
cada línea de un archivo de entrada o secuencia. |
1671 |
</p> |
1672 |
|
1673 |
<p> |
1674 |
La orden <c>nl</c> agrega una número a cada línea de entrada. Útil |
1675 |
para impresiones. |
1676 |
</p> |
1677 |
|
1678 |
<p> |
1679 |
<c>pr</c> es usado para romper archivos en varias páginas de salida; |
1680 |
normalmente es usado para impresión. |
1681 |
</p> |
1682 |
|
1683 |
<p> |
1684 |
<c>tr</c> es una herramienta de traducción de caracteres; es usada |
1685 |
para asignar a ciertos caracteres de la secuencia de entrada otros |
1686 |
caracteres en la secuencia de salida. |
1687 |
</p> |
1688 |
|
1689 |
<p> |
1690 |
<c>sed</c> es un poderoso editor de texto orientado a secuencias. |
1691 |
Puede aprender más acerca de sed en los siguientes artículos de IBM |
1692 |
developerWorks: |
1693 |
</p> |
1694 |
|
1695 |
<ul> |
1696 |
<li> |
1697 |
<uri link="/doc/es/articles/l-sed1.xml">Sed mediante ejemplos, |
1698 |
Parte 1</uri> |
1699 |
</li> |
1700 |
<li> |
1701 |
<uri link="/doc/es/articles/l-sed2.xml">Sed mediante ejemplos, |
1702 |
Parte 2</uri> |
1703 |
</li> |
1704 |
<li> |
1705 |
<uri link="/doc/es/articles/l-sed3.xml">Sed mediante ejemplos, |
1706 |
Parte 3</uri> |
1707 |
</li> |
1708 |
</ul> |
1709 |
|
1710 |
<p> |
1711 |
Si está planeando tomar el examen LPI, asegúrese de leer los primeros |
1712 |
dos artículos de esta serie. |
1713 |
</p> |
1714 |
|
1715 |
<p> |
1716 |
<c>awk</c> es un lenguaje práctico de procesamiento de texto. Para |
1717 |
aprender más acerca de awk, lea los siguientes artículos de IBM |
1718 |
developerWorks: |
1719 |
</p> |
1720 |
|
1721 |
<ul> |
1722 |
<li> |
1723 |
<uri link="/doc/es/articles/l-awk1.xml">Awk mediante ejemplos, |
1724 |
Parte 1</uri> |
1725 |
</li> |
1726 |
<li> |
1727 |
<uri link="/doc/es/articles/l-awk2.xml">Awk mediante ejemplos, |
1728 |
Parte 2</uri> |
1729 |
</li> |
1730 |
<li> |
1731 |
<uri link="/doc/es/articles/l-awk3.xml">Awk mediante ejemplos, |
1732 |
Parte 3</uri> |
1733 |
</li> |
1734 |
</ul> |
1735 |
|
1736 |
<p> |
1737 |
<c>od</c> está diseñado para transformar una secuencia de entrada en |
1738 |
un formato octal o hexadecimal "volcado". |
1739 |
</p> |
1740 |
|
1741 |
<p> |
1742 |
<c>split</c> es una orden utilizada para dividir un archivo grande en |
1743 |
pedazos más pequeños y más manejables. |
1744 |
</p> |
1745 |
|
1746 |
<p> |
1747 |
<c>fmt</c> dará formato a párrafos para que estos se ajusten al |
1748 |
margen. Hoy en día es menos útil, ya que esta habilidad la poseen la |
1749 |
mayoría de los editores de texto, pero aún así es bueno saber. |
1750 |
</p> |
1751 |
|
1752 |
<p> |
1753 |
<c>paste</c> toma dos o más archivos como entrada, concatena cada |
1754 |
línea secuencial de los archivos de entrada, e imprime las líneas |
1755 |
resultantes. Puede ser útil para crear tablas o columnas de texto. |
1756 |
</p> |
1757 |
|
1758 |
<p> |
1759 |
<c>join</c> es similar a paste, pero utiliza un campo (el primero de modo |
1760 |
predeterminado) en cada línea para que coincida lo que debe combinarse |
1761 |
en una sola línea. |
1762 |
</p> |
1763 |
|
1764 |
<p> |
1765 |
<c>tee</c> imprime su entrada tanto en un archivo como en la |
1766 |
pantalla. Esto es útil cuando quiera crear un registro de algo, pero |
1767 |
además quiere verlo en pantalla. |
1768 |
</p> |
1769 |
|
1770 |
</body> |
1771 |
</section> |
1772 |
<section> |
1773 |
<title>¡El curso exprés termina!. Redirección</title> |
1774 |
<body> |
1775 |
|
1776 |
<p> |
1777 |
Similar a usar <c>></c> en la línea de comando de bash, puede usar |
1778 |
para redireccionar un archivo a una orden. Para muchas órdenes, puede |
1779 |
simplemente especificar el nombre de archivo en la línea de comando, |
1780 |
sin embargo algunas órdenes solo funcionan desde la entrada estándar. |
1781 |
</p> |
1782 |
|
1783 |
<p> |
1784 |
Bash y otros intérpretes de comando respaldan el concepto de un |
1785 |
"archivoaquí". Esto le permite especificar la entrada de una orden en |
1786 |
las líneas siguientes a la invocación de la orden, terminándola con |
1787 |
un valor especial. Es más fácil mediante un ejemplo: |
1788 |
</p> |
1789 |
|
1790 |
<pre caption="Redirección en acción"> |
1791 |
$ <i>sort <<END</i> |
1792 |
manzana |
1793 |
arándano |
1794 |
plátano |
1795 |
END |
1796 |
arándano |
1797 |
manzana |
1798 |
plátano |
1799 |
</pre> |
1800 |
|
1801 |
<p> |
1802 |
En el ejemplo de arriba, escribimos las palabras manzana, arándano y |
1803 |
plátano seguidos por "END" lo que significa el fin de la entrada. El |
1804 |
programa <c>sort</c> regresa nuestras palabras ordenadas |
1805 |
alfabéticamente. |
1806 |
</p> |
1807 |
|
1808 |
</body> |
1809 |
</section> |
1810 |
<section> |
1811 |
<title>Uso de >></title> |
1812 |
<body> |
1813 |
|
1814 |
<p> |
1815 |
Tal vez esperaría que <c>>></c> fuera de alguna manera análogo |
1816 |
a <c><<</c>, pero en realidad no lo es. Significa simplemente |
1817 |
agregar la salida a un archivo, en lugar de sobreescribir como <c>> |
1818 |
</c> lo haría. Por ejemplo: |
1819 |
</p> |
1820 |
|
1821 |
<pre caption="Redireccionando a un archivo"> |
1822 |
$ <i>echo Hola > miarchivo</i> |
1823 |
$ <i>echo allá. > miarchivo</i> |
1824 |
$ <i>cat miarchivo</i> |
1825 |
allá. |
1826 |
</pre> |
1827 |
|
1828 |
<p> |
1829 |
¡Uy! ¡Perdimos la porción "Hola"! Lo que queríamos decir era esto: |
1830 |
</p> |
1831 |
|
1832 |
<pre caption="Anexar a un archivo"> |
1833 |
$ <i>echo Hola > miarchivo</i> |
1834 |
$ <i>echo allá. >> miarchivo</i> |
1835 |
$ <i>cat miarchivo</i> |
1836 |
Hola |
1837 |
allá. |
1838 |
</pre> |
1839 |
|
1840 |
<p> |
1841 |
¡Mucho mejor! |
1842 |
</p> |
1843 |
|
1844 |
</body> |
1845 |
</section> |
1846 |
</chapter> |
1847 |
|
1848 |
<chapter> |
1849 |
<title>Módulos del núcleo</title> |
1850 |
<section> |
1851 |
<title>Conozca "uname"</title> |
1852 |
<body> |
1853 |
|
1854 |
<p> |
1855 |
La orden <c>uname</c> le provee una variedad de información |
1856 |
interesante acerca de su sistema. Aquí está lo que se despliega en mi |
1857 |
estación de desarrollo cuando tecleo <c>uname -a</c> el cual le dice |
1858 |
a la orden <c>uname</c> que imprima toda la información de una sola |
1859 |
vez: |
1860 |
</p> |
1861 |
|
1862 |
<pre caption="uname -a"> |
1863 |
$ <i>uname -a</i> |
1864 |
Linux inventor 2.4.20-gaming-r1 #1 Fri Apr 11 18:33:35 MDT 2003 i686 |
1865 |
AMD Athlon(tm) XP 2100+ AuthenticAMD GNU/Linux |
1866 |
</pre> |
1867 |
|
1868 |
</body> |
1869 |
</section> |
1870 |
<section> |
1871 |
<title>Más locura uname</title> |
1872 |
<body> |
1873 |
|
1874 |
<p> |
1875 |
Ahora, veamos la información que provee <c>uname</c>: |
1876 |
</p> |
1877 |
|
1878 |
<pre caption="Información de uname"> |
1879 |
info. opción arg ejemplo |
1880 |
nombre de núcleo -s "Linux" |
1881 |
nombre del anfitrión -n "inventor" |
1882 |
revisión del núcleo -r "2.4.20-gaming-r1" |
1883 |
versión de núcleo -v "#1 Fri Apr 11 18:33:35 MDT 2003" |
1884 |
máquina -m "i686" |
1885 |
procesador -p "AMD Athlon(tm) XP 2100+" |
1886 |
plataforma de hardware -i "AuthenticAMD" |
1887 |
sistema operativo -o "GNU/Linux" |
1888 |
</pre> |
1889 |
|
1890 |
<p> |
1891 |
¡Intrigante! ¿Qué imprime la salida de su orden <c>uname -a</c>? |
1892 |
</p> |
1893 |
|
1894 |
</body> |
1895 |
</section> |
1896 |
<section> |
1897 |
<title>La revisión del núcleo</title> |
1898 |
<body> |
1899 |
|
1900 |
<p> |
1901 |
He aquí un truco de magia. Primero, escriba <c>uname -r</c> para que |
1902 |
la orden uname imprima la revisión del núcleo Linux que se está |
1903 |
ejecutando actualmente. |
1904 |
</p> |
1905 |
|
1906 |
<p> |
1907 |
Ahora, mire en el directorio <path>/lib/modules</path> y, ¡presto! |
1908 |
¡Apuesto que encontrará un directorio con el mismo nombre! Está bien, |
1909 |
no es tan mágico, pero ahora es un buen momento para hablar del |
1910 |
significado de los directorios en <path>/lib/modules</path> y |
1911 |
explicar que son los módulos. |
1912 |
</p> |
1913 |
|
1914 |
</body> |
1915 |
</section> |
1916 |
<section> |
1917 |
<title>El núcleo</title> |
1918 |
<body> |
1919 |
|
1920 |
<p> |
1921 |
El núcleo Linux es el corazón de lo que comúnmente llamamos "Linux" |
1922 |
-- es la pieza de código que accede a su hardware directamente y |
1923 |
provee abstracciones para que los programas regulares antiguos puedan |
1924 |
ejecutarse. Gracias al núcleo, su editor de texto no necesita |
1925 |
preocuparse acerca de si está escribiendo en un disco SCSI o IDE -- o |
1926 |
incluso en un disco RAM. Simplemente escribe a un archivo de sistema, |
1927 |
y el núcleo se encarga del resto. |
1928 |
</p> |
1929 |
|
1930 |
</body> |
1931 |
</section> |
1932 |
<section> |
1933 |
<title>Introducción a los módulos del núcleo</title> |
1934 |
<body> |
1935 |
|
1936 |
<p> |
1937 |
Entonces, ¿qué son los módulos del núcleo? Bueno, son partes del |
1938 |
núcleo que han sido almacenadas en el disco con un formato especial. |
1939 |
A su orden, podrán ser cargados en el núcleo en ejecución y proveer |
1940 |
funcionalidades adicionales. |
1941 |
</p> |
1942 |
|
1943 |
<p> |
1944 |
Debido a que los módulos del núcleo son cargados a demanda, puede |
1945 |
tener en su núcleo soporte para una gran cantidad de funciones |
1946 |
adicionales que normalmente no quiere tener habilitadas. Pero en |
1947 |
alguna rara ocasión, aquellos módulos del núcleo pueden sernos útiles |
1948 |
y pueden cargarse -- a menudo de manera automática -- para apoyar ese |
1949 |
raro sistema de archivos o dispositivo que raramente usa. |
1950 |
</p> |
1951 |
|
1952 |
</body> |
1953 |
</section> |
1954 |
<section> |
1955 |
<title>Módulos del núcleo en pocas palabras</title> |
1956 |
<body> |
1957 |
|
1958 |
<p> |
1959 |
En resumen, los módulos del núcleo le permiten al núcleo en ejecución |
1960 |
habilitar capacidades en base a la demanda. Sin los módulos del |
1961 |
núcleo, tendría que compilar un nuevo núcleo completo y reiniciar |
1962 |
para tener el apoyo de las nuevas características. |
1963 |
</p> |
1964 |
|
1965 |
</body> |
1966 |
</section> |
1967 |
<section> |
1968 |
<title>lsmod</title> |
1969 |
<body> |
1970 |
|
1971 |
<p> |
1972 |
Para ver cuales módulos están cargados actualmente en su sistema, use |
1973 |
la orden <c>lsmod</c>: |
1974 |
</p> |
1975 |
|
1976 |
<pre caption="Uso de lsmod"> |
1977 |
# <i>lsmod</i> |
1978 |
Module Size Used by Tainted: PF |
1979 |
vmnet 20520 5 |
1980 |
vmmon 22484 11 |
1981 |
nvidia 1547648 10 |
1982 |
mousedev 3860 2 |
1983 |
hid 16772 0 (unused) |
1984 |
usbmouse 1848 0 (unused) |
1985 |
input 3136 0 [mousedev hid usbmouse] |
1986 |
usb-ohci 15976 0 (unused) |
1987 |
ehci-hcd 13288 0 (unused) |
1988 |
emu10k1 64264 2 |
1989 |
ac97_codec 9000 0 [emu10k1] |
1990 |
sound 51508 0 [emu10k1] |
1991 |
usbcore 55168 1 [hid usbmouse usb-ohci ehci-hcd] |
1992 |
</pre> |
1993 |
|
1994 |
</body> |
1995 |
</section> |
1996 |
<section> |
1997 |
<title>Listado de módulos</title> |
1998 |
<body> |
1999 |
|
2000 |
<p> |
2001 |
Como puede ver, mi sistema tiene unos cuantos módulos cargados. Los |
2002 |
módulos vmnet y vmmon proveen la funcionalidad necesaria para mi |
2003 |
programa <uri link="http://www.vmware.com/">VMWare</uri>, el cual me |
2004 |
permite ejecutar una PC virtual en una ventana del escritorio. El |
2005 |
módulo de "nvidia" viene de la corporación |
2006 |
<uri link="http://www.nvidia.com/">NVIDIA</uri> la cual me permite |
2007 |
utilizar mi tarjeta de gráficos de gran desempeño con aceleración para 3D |
2008 |
bajo Linux al tiempo que toma ventaja de sus características. |
2009 |
</p> |
2010 |
|
2011 |
<p> |
2012 |
Además tengo un montón de módulos usados para darle respaldo a mis |
2013 |
dispositivos de entrada basados en USB --llamados "mousedev", "hid", |
2014 |
"usbmouse", "input", "usb-ohci", "ehci-hcd" y "usbcore." Algunas |
2015 |
veces tiene sentido configurar su núcleo para darle soporte al USB en |
2016 |
forma de módulos. ¿Por qué? Porque los dispositivos USB son del tipo |
2017 |
"conecta y usa" y cuando tiene el respaldo USB como módulo, entonces |
2018 |
puede ir a comprar un nuevo dispositivo USB, conectarlo a su sistema, |
2019 |
y que el sistema cargue automáticamente los módulos apropiados para |
2020 |
habilitar ese dispositivo. Es práctico hacer las cosas de esta manera. |
2021 |
</p> |
2022 |
|
2023 |
</body> |
2024 |
</section> |
2025 |
<section> |
2026 |
<title>Módulos de terceras partes</title> |
2027 |
<body> |
2028 |
|
2029 |
<p> |
2030 |
Para completar mi lista de módulos están "emu10k1", "ac97_codec" y |
2031 |
"sound", que juntos proveen soporte para mi tarjeta de sonido |
2032 |
SoundBlaster Audigy. |
2033 |
</p> |
2034 |
|
2035 |
<p> |
2036 |
Cabe señalar que algunos de mis módulos de núcleo provienen de las |
2037 |
fuentes del núcleo mismo. Por ejemplo, todos los módulos relacionados |
2038 |
al USB son compilados desde las fuentes del núcleo estándar de |
2039 |
Linux. Sin embargo, el nvidia, emul10k1 y los relacionados a VMWare, |
2040 |
provienen de otras fuentes. Esto resalta otra ventaja importante de |
2041 |
los módulos del núcleo -- permiten a terceras partes proveer |
2042 |
funcionalidades necesarias al núcleo y además permiten la |
2043 |
funcionalidad de "conectarse" a un núcleo Linux que se encuentra |
2044 |
ejecutándose. No es necesario reiniciar el sistema. |
2045 |
</p> |
2046 |
|
2047 |
</body> |
2048 |
</section> |
2049 |
<section> |
2050 |
<title>depmod y amigos</title> |
2051 |
<body> |
2052 |
|
2053 |
<p> |
2054 |
En el directorio <path>/lib/modules/2.4.20-gaming-r1/</path>, tengo |
2055 |
un número de archivos que inician con la cadena "modules.": |
2056 |
</p> |
2057 |
|
2058 |
<pre caption="Otros módulos"> |
2059 |
$ <i>ls /lib/modules/2.4.20-gaming-r1/modules.*</i> |
2060 |
/lib/modules/2.4.20-gaming-r1/modules.dep |
2061 |
/lib/modules/2.4.20-gaming-r1/modules.generic_string |
2062 |
/lib/modules/2.4.20-gaming-r1/modules.ieee1394map |
2063 |
/lib/modules/2.4.20-gaming-r1/modules.isapnpmap |
2064 |
/lib/modules/2.4.20-gaming-r1/modules.parportmap |
2065 |
/lib/modules/2.4.20-gaming-r1/modules.pcimap |
2066 |
/lib/modules/2.4.20-gaming-r1/modules.pnpbiosmap |
2067 |
/lib/modules/2.4.20-gaming-r1/modules.usbmap |
2068 |
</pre> |
2069 |
|
2070 |
<p> |
2071 |
Estos archivos contienen algunas porciones de información de |
2072 |
dependencias. Por un lado, registran la información de *dependencia* |
2073 |
para módulos -- algunos módulos requieren que otros módulos sean |
2074 |
cargados antes de ejecutarse. Esta información es almacenada en estos |
2075 |
archivos. |
2076 |
</p> |
2077 |
|
2078 |
</body> |
2079 |
</section> |
2080 |
<section> |
2081 |
<title>¿Cómo obtener módulos?</title> |
2082 |
<body> |
2083 |
|
2084 |
<p> |
2085 |
Algunos módulos del núcleo están diseñados para trabajar con |
2086 |
dispositivos específicos de hardware, como mi módulo "emuk10k1", el |
2087 |
cual es para mi tarjeta SoundBlaster Audigy. Para ese tipo de módulos, |
2088 |
existen archivos que además graban los identificadores PCI y marcas |
2089 |
de identificación de los dispositivos de hardware que respaldan. Esta |
2090 |
información puede ser utilizada para actividades como los scripts |
2091 |
"conexión rápida" (de los cuales hablaremos en los siguientes |
2092 |
tutoriales) para autodetectar hardware y cargar los módulos |
2093 |
apropiados para respaldar dicho hardware de manera automática. |
2094 |
</p> |
2095 |
|
2096 |
</body> |
2097 |
</section> |
2098 |
<section> |
2099 |
<title>Uso de depmod</title> |
2100 |
<body> |
2101 |
|
2102 |
<p> |
2103 |
Si alguna vez ha instalado un módulo nuevo, la información de |
2104 |
dependencia puede estar obsoleta. Para actualizarla simplemente teclee |
2105 |
<c>depmod -a</c>. El programa <c>depmod</c> hará un análisis de todos |
2106 |
los módulos en los directorios <path>/lib/modules</path> y |
2107 |
actualizará la información de dependencias. Esto se logra analizando |
2108 |
los archivos de módulos en <path>/lib/modules</path> y revisando lo |
2109 |
que se le conoce como "símbolos" dentro de los módulos. |
2110 |
</p> |
2111 |
|
2112 |
</body> |
2113 |
</section> |
2114 |
<section> |
2115 |
<title>Localizando módulos del núcleo</title> |
2116 |
<body> |
2117 |
|
2118 |
<p> |
2119 |
Entonces, ¿qué apariencia tienen los módulos del núcleo?, Para los |
2120 |
núcleos 2.4, los módulos son generalmente cualquier archivo del árbol |
2121 |
<path>/lib/modules</path> que termine en ".o". Para ver todos los |
2122 |
módulos en <path>/lib/modules</path>, escriba lo siguiente: |
2123 |
</p> |
2124 |
|
2125 |
<pre caption="Módulos del núcleo en /lib/modules"> |
2126 |
# <i>find /lib/modules -name '*.o'</i> |
2127 |
/lib/modules/2.4.20-gaming-r1/misc/vmmon.o |
2128 |
/lib/modules/2.4.20-gaming-r1/misc/vmnet.o |
2129 |
/lib/modules/2.4.20-gaming-r1/video/nvidia.o |
2130 |
/lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o |
2131 |
/lib/modules/2.4.20-gaming-r1/kernel/fs/vfat/vfat.o |
2132 |
/lib/modules/2.4.20-gaming-r1/kernel/fs/minix/minix.o |
2133 |
[lista truncada para hacerla más breve] |
2134 |
</pre> |
2135 |
|
2136 |
</body> |
2137 |
</section> |
2138 |
<section> |
2139 |
<title>insmod vs. modprobe</title> |
2140 |
<body> |
2141 |
|
2142 |
<p> |
2143 |
Bien, ¿cómo se realiza la carga de un módulo en un núcleo en |
2144 |
ejecución? Un modo es utilizar la orden <c>insmod</c> para |
2145 |
especificar la ruta completa a el módulo que se desea cargar: |
2146 |
</p> |
2147 |
|
2148 |
<pre caption="Uso de insmod"> |
2149 |
# <i>insmod /lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o</i> |
2150 |
# <i>lsmod | grep fat</i> |
2151 |
fat 29272 0 (unused) |
2152 |
</pre> |
2153 |
|
2154 |
<p> |
2155 |
Sin embargo, normalmente las cargas de módulos se realizan usando la |
2156 |
orden <c>modprobe</c>. Una de las cosas buenas acerca de la orden |
2157 |
<c>modprobe</c> es que automáticamente se encarga de cargar módulos |
2158 |
dependientes. Además, no es necesario especificar la ruta al módulo |
2159 |
que desee cargar, ni especificar al final el ".o". |
2160 |
</p> |
2161 |
|
2162 |
</body> |
2163 |
</section> |
2164 |
<section> |
2165 |
<title>rmmod y modprobe en acción</title> |
2166 |
<body> |
2167 |
|
2168 |
<p> |
2169 |
Descarguemos nuestro módulo "fat.o" y carguémoslo de nuevo usando |
2170 |
<c>modprobe</c>: |
2171 |
</p> |
2172 |
|
2173 |
<pre caption="rmmod y modprobe en acción"> |
2174 |
# <i>rmmod fat</i> |
2175 |
# <i>lsmod | grep fat</i> |
2176 |
# <i>modprobe fat</i> |
2177 |
# <i>lsmod | grep fat</i> |
2178 |
fat 29272 0 (unused) |
2179 |
</pre> |
2180 |
|
2181 |
<p> |
2182 |
Como puede ver, la orden <c>rmmod</c> trabaja de manera similar a |
2183 |
modprobe, pero tiene el efecto contrario: desactivar el módulo que |
2184 |
le ha especificado. |
2185 |
</p> |
2186 |
|
2187 |
</body> |
2188 |
</section> |
2189 |
<section> |
2190 |
<title>Sus amigos modinfo y modules.conf</title> |
2191 |
<body> |
2192 |
|
2193 |
<p> |
2194 |
Puede utilizar la orden <c>modinfo</c> para aprender cosas |
2195 |
interesantes acerca de sus módulos favoritos: |
2196 |
</p> |
2197 |
|
2198 |
<pre caption="Uso de modinfo"> |
2199 |
# <i>modinfo fat</i> |
2200 |
filename: /lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o |
2201 |
description: <none> |
2202 |
author: <none> |
2203 |
license: "GPL" |
2204 |
</pre> |
2205 |
|
2206 |
<p> |
2207 |
Tome nota especial del archivo <path>/etc/modules.conf</path>. Este |
2208 |
archivo contiene información de configuración para <c>modprobe</c>. |
2209 |
Le permite ajustar la funcionalidad de <c>modprobe</c> mencionando |
2210 |
cuales módulos debe ser cargados antes/después de cargar otros, |
2211 |
ejecutar scripts antes/después de cargar módulos y más. |
2212 |
</p> |
2213 |
|
2214 |
</body> |
2215 |
</section> |
2216 |
<section> |
2217 |
<title>Aspectos relevantes de modules.conf</title> |
2218 |
<body> |
2219 |
|
2220 |
<p> |
2221 |
La sintaxis y funcionalidad de <path>modules.conf</path> es un poco |
2222 |
complicada y no veremos su sintaxis ahora (teclee <c>man modules.conf</c> |
2223 |
para ver todos los detalles), pero aquí están algunas cosas que |
2224 |
*debería* saber acerca de este archivo. |
2225 |
</p> |
2226 |
|
2227 |
<p> |
2228 |
Muchas distribuciones generan este archivo de manera automática a |
2229 |
partir de un grupo de archivos en otro directorio, como |
2230 |
<path>/etc/modules.d/</path>. Por ejemplo, Gentoo Linux tiene un directorio |
2231 |
<path>/etc/modules.d/</path>, y al ejecutar la orden <c>update-modules</c> |
2232 |
tomará cada archivo en <path>/etc/modules.d/</path> y los |
2233 |
concatenará para producir un nuevo <path>/etc/modules.conf/</path>. |
2234 |
Por lo tanto, haga sus cambios a los archivos en |
2235 |
<path>/etc/modules.d/</path> y ejecute update-modules si está usando |
2236 |
Gentoo. Si está usando Debian, el procedimiento es similar excepto que el |
2237 |
directorio es llamado <path>/etc/modutils/</path>. |
2238 |
</p> |
2239 |
|
2240 |
</body> |
2241 |
</section> |
2242 |
</chapter> |
2243 |
|
2244 |
<chapter> |
2245 |
<title>Resumen y bibliografía</title> |
2246 |
<section> |
2247 |
<title>Resumen</title> |
2248 |
<body> |
2249 |
|
2250 |
<p> |
2251 |
¡Felicidades; ha alcanzado el final de este tutorial en administración |
2252 |
Linux básica! Esperamos que le haya ayudado a reafirmar sus |
2253 |
conocimientos fundamentales de Linux. Por favor, únase a nosotros en |
2254 |
el siguiente tutorial que cubre administración intermedia donde, partiendo |
2255 |
de los fundamentos vistos aquí, veremos temas como permisos de Linux y el |
2256 |
modelo de propiedad, manejo de cuentas de usuario, creación y montaje de |
2257 |
sistema de archivos y más. Y recuerde, continuando con esta serie de |
2258 |
tutoriales, pronto estará listo para obtener su certificación LPIC Nivel 1 |
2259 |
del Instituto Profesional Linux. |
2260 |
</p> |
2261 |
|
2262 |
</body> |
2263 |
</section> |
2264 |
<section> |
2265 |
<title>Bibliografía</title> |
2266 |
<body> |
2267 |
|
2268 |
<p> |
2269 |
Hablando de certificación LPIC, si es algo en lo que está interesado, |
2270 |
entonces le recomendamos que estudie la siguiente bibliografía, la |
2271 |
cual ha sido seleccionada cuidadosamente para aumentar el material |
2272 |
cubierto en este tutorial: |
2273 |
</p> |
2274 |
|
2275 |
<p> |
2276 |
Existe gran cantidad de buena bibliografía de expresiones regulares |
2277 |
en Internet. Aquí hay dos que hemos encontrado: |
2278 |
</p> |
2279 |
|
2280 |
<ul> |
2281 |
<li> |
2282 |
<uri link="http://www.zvon.org/other/reReference/Output/">Regular |
2283 |
Expressions Reference</uri> |
2284 |
</li> |
2285 |
<li> |
2286 |
<uri link="http://zez.org/article/articleview/11/">Regular |
2287 |
Expressions Explained</uri> |
2288 |
</li> |
2289 |
</ul> |
2290 |
|
2291 |
<p> |
2292 |
Asegúrese de leer el Estándar de la jerarquía del sistema de archivos |
2293 |
en <uri>http://www.pathname.com/fhs/</uri>. |
2294 |
</p> |
2295 |
|
2296 |
<p> |
2297 |
En <uri link="/doc/es/articles/bash-by-example-p1.xml">Bash con |
2298 |
ejemplos, serie de artículos</uri>, le mostraré como usar |
2299 |
programación de bash para crear sus propios scripts. Esta serie |
2300 |
(particularmente parte uno y dos) le darán una buena preparación para |
2301 |
el examen nivel 1 del LPIC: |
2302 |
</p> |
2303 |
|
2304 |
<p> |
2305 |
Puede aprender más acerca de <c>sed</c> en los <uri |
2306 |
link="http://www-106.ibm.com/developerworks/linux/library/l-sed1.html?dwzone=linux"> |
2307 |
relevent IBM developerWorks articles</uri>. Si está planeando |
2308 |
tomar el examen LPI, asegúrese de leer los dos primeros artículos de |
2309 |
esta serie. |
2310 |
</p> |
2311 |
|
2312 |
<p> |
2313 |
Para aprender más acerca de <c>awk</c>, lea <uri |
2314 |
link="http://www-106.ibm.com/developerworks/linux/library/l-awk1.html?dwzone=linux"> |
2315 |
relevent IBM developerWorks articles</uri>. |
2316 |
</p> |
2317 |
|
2318 |
<p> |
2319 |
Es altamente recomendable revisar <uri |
2320 |
link="http://www-106.ibm.com/developerworks/linux/library/l-faq/index.html"> |
2321 |
Technical FAQ for Linux users</uri>, un listado de 50 páginas que |
2322 |
muestran la lista de preguntas más frecuentes de Linux con respuestas |
2323 |
detalladas. El FAQ es un archivo formato PDF (Acrobat). Si es un |
2324 |
usuario Linux principiante o intermedio, definitivamente debe revisar |
2325 |
este FAQ. |
2326 |
</p> |
2327 |
|
2328 |
<p> |
2329 |
Si no está familiarizado con el editor <c>vi</c>, es altamente |
2330 |
recomendable que revise el tutorial |
2331 |
<uri link="http://www-106.ibm.com/developerworks/edu/l-dw-linuxvi-i.html"> |
2332 |
Vi -- the cheat sheet method</uri>. Este tutorial le da una introducción |
2333 |
rápida a este poderoso editor de texto. Considérelo como un material |
2334 |
del tipo "debe leer" si no sabe cómo utilizar <c>vi</c>. |
2335 |
</p> |
2336 |
|
2337 |
</body> |
2338 |
</section> |
2339 |
</chapter> |
2340 |
</guide> |