viernes, 30 de octubre de 2015

Parando (pausando) un proceso

A veces queremos parar un proceso sin terminarlo. Esto se hace a menudo para permitir que un proceso que está en primer plano sea movido a segundo plano. Para parar un proceso que está en primer plano, pulsa Ctrl-z. Pruébalo. En la línea de comandos, escribe xlogo, pulsa ENTER y luego Ctrl-z:

[me@linuxbox ~]$ xlogo
[1]+ Stopped                 xlogo
[me@linuxbox ~]$

Después de parar xlogo, podemos verificar que el programa se ha detenido al intentar redimensionar la ventana de xlogo. Veremos que parece un poco muerta. Podemos devolver el programa a primer plano, usando el comando fg, o mover el programa a segundo plano con el comando bg:

[me@linuxbox ~]$ bg %1
[1]+ xlogo &
[me@linuxbox ~]$

Como en el comando fg, el jobspec es opcional si sólo hay un trabajo.

Mover un proceso desde el primer plano al segundo plano es útil si arrancamos un programa gráfico desde comandos, pero olvidamos colocarlo en segundo plano añadiendo “&” al final.

¿Por qué querrías arrancar un programa gráfico desde la línea de comandos? Hay dos razones. Primero, el programa que quieres iniciar no está incluido en los menús del gestor de ventanas (como xlogo). En segundo lugar, ejecutando un programa desde la línea de comandos, podrías ver mensajes de error que serían invisibles si fuera ejecutado gráficamente. A veces, un programa puede fallar si se inicia desde el menú gráfico. Arrancándolo desde la línea de comandos verás un mensaje de error que revelará el problema. Además, algunos programas gráficos pueden tener muchas opciones interesantes y útiles en la línea de comandos.

miércoles, 28 de octubre de 2015

Devolviendo un proceso a primer plano

Un proceso en segundo plano es inmune a nuestras entradas de teclado, incluyendo cualquier intento de interrumpirlo con Ctrl-c. Para devolver un proceso a primer plano, usa el comando fg, de esta forma:

[me@linuxbox ~]$ jobs
[1]+ Running                 xlogo &
[me@linuxbox ~]$ fg %1
xlogo

El comando fg seguido de un signo de porcentaje y el número del trabajo (llamado jobspec) hace el truco. Si sólo tenemos un trabajo en segundo plano, el jobspec es opcional. Para terminar xlogo, presiona Ctrl-c.

lunes, 26 de octubre de 2015

Enviando un proceso a segundo plano

Digamos que queremos traer de vuelta el prompt de shell sin terminar el programa xlogo. Lo haremos enviando el programa a segundo plano. Piensa en el terminal como si tuviera un primer plano (con cosas visibles en la superficie como el prompt del shell) y un segundo plano (con cosas ocultas bajo la superficie). Para arrancar un programa y que se coloque inmediatamente en segundo plano, añadiremos al comando un carácter “&”:

[me@linuxbox ~]$ xlogo &
[1] 28236
[me@linuxbox ~]$

Después de introducir el comando, aparece la ventana de xlogo y el prompt de shell vuelve, pero también aparecen algunos números extraños. Este mensaje es parte de una característica del shell llamada control de trabajo (job control). Con este mensaje, el shell nos está diciendo que hemos comenzado el trabajo número 1 (“[1]”) y que tiene el PID 28236. Si ejecutamos ps, podemos ver nuestro proceso:

[me@linuxbox ~]$ ps
 PID TTY               TIME CMD
10603 pts/1           00:00:00 bash
28236 pts/1           00:00:00 xlogo
28239 pts/1           00:00:00 ps

La característica de control de trabajos del shell también nos da una forma de listar los trabajos que hemos arrancado desde nuestro terminal. Utilizando el comando jobs, podemos ver esta lista:

[me@linuxbox ~]$ jobs
[1]+ Running              xlogo &

Los resultados muestran que tenemos un trabajo, con el número “1”, que está funcionando, y que el comando fue xlogo &.

viernes, 23 de octubre de 2015

Interrumpiendo un proceso

Observemos qué ocurre cuando ejecutamos el programa xlogo de nuevo. Primero, introducimos el comando xlogo y verificamos que el programa está funcionando. A continuación, volvemos a la ventana del terminal y pulsamos Ctrl-c.

[me@linuxbox ~]$ xlogo
[me@linuxbox ~]$

En un terminal, pulsar Ctrl-c, interrumpe un programa. Esto significa que le pedimos educadamente al programa que termine. Después de pulsar Ctrl-c, la ventana de xlogo se cierra y el prompt de shell vuelve.

Muchos (pero no todos) programas de la línea de comandos pueden ser interrumpidos usando esta técnica.

miércoles, 21 de octubre de 2015

Controlando procesos

Ahora que podemos ver y monitorizar procesos, consigamos controlarlos. Para nuestros experimentos, vamos a utilizar un pequeño programa, llamado xlogo, como conejillo de indias. El programa xlogo es un programa de muestra proporcionado por el sistema X Window (el motor en segundo plano que hace que los gráficos se vean en nuestra pantalla) que simplemente muestra una ventana redimensionable que contiene el logo de X. Primero, vamos a conocer a nuestro sujeto de pruebas:

[me@linuxbox ~]$ xlogo

Después de introducir el comando, una pequeña ventana conteniendo el logo debería aparecer en algún lugar de la pantalla. En algunos sistemas, xlogo puede mostrar un mensaje de advertencia, pero se puede ignorar tranquilamente.

Consejo: Si tu sistema no incluye el programa xlogo, prueba a usar gedit o kwrite en su lugar.

Podemos verificar que xlogo está funcionando modificando el tamaño de la ventana. Si el logo se redibuja en el nuevo tamaño, el programa está funcionando.

¿Ves que nuestro prompt de shell no ha vuelto? Esto es porque el shell está esperando a que el programa termine, como todos los demás programas que hemos usado hasta ahora. Si cerramos la ventana de xlogo, el prompt vuelve.

lunes, 19 de octubre de 2015

Viendo los procesos dinámicamente con top

Si bien el comando ps puede revelar mucho de lo que está haciendo la máquina, sólo proporciona una fotografía del estado de la máquina en el momento en que se ejecuta el comando ps. Para ver una vista más dinámica de la actividad de la máquina, usamos el comando top:

[me@linuxbox ~]$ top

El programa top muestra una pantalla en actualización constante (por defecto, cada 3 segundos) con los procesos del sistema listados por orden de actividad. El nombre “top” viene del hecho de que el programa top se usa para ver los procesos “top” del sistema. La pantalla de top contiene dos partes: un sumario del sistema en la parte de arriba de la pantalla, seguido de una tabla de los procesos ordenados por actividad de la CPU:

top - 14:59:20 up 6:30, 2 users, load average: 0.07, 0.02, 0.00
Tasks: 109 total, 1 running, 106 sleeping, 0 stopped, 2 zombie
Cpu(s): 0.7%us, 1.0%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.0%si
Mem:  319496k total, 314860k used,   4636k free,  19392k buff
Swap: 875500k total, 149128k used, 726372k free, 114676k cach
PID   USER PR NI VIRT  RES  SHR  S %CPU %MEM TIME+    COMMAND
6244  me   39 19 31752 3124 2188 S 6.3  1.0  16:24.42 trackerd
11071 me   20  0  2304 1092  840 R 1.3  0.3   0:00.14 top
6180  me   20  0  2700 1100  772 S 0.7  0.3   0:03.66 dbus-dae
6321  me   20  0 20944 7248 6560 S 0.7  2.3   2:51.38 multiloa
4955  root 20  0  104m 9668 5776 S 0.3  3.0   2:19.39 Xorg
1     root 20  0  2976  528  476 S 0.0  0.2   0:03.14 init
2     root 15 -5     0    0    0 S 0.0  0.0   0:00.00 kthreadd
3     root RT -5     0    0    0 S 0.0  0.0   0:00.00 migratio
4     root 15 -5     0    0    0 S 0.0  0.0   0:00.72 ksoftirq
5     root RT -5     0    0    0 S 0.0  0.0   0:00.04 watchdog
6     root 15 -5     0    0    0 S 0.0  0.0   0:00.42 events/0
7     root 15 -5     0    0    0 S 0.0  0.0   0:00.06 khelper
41    root 15 -5     0    0    0 S 0.0  0.0   0:01.08 kblockd/
67    root 15 -5     0    0    0 S 0.0  0.0   0:00.00 kseriod
114   root 20  0     0    0    0 S 0.0  0.0   0:01.62 pdflush
116   root 15 -5     0    0    0 S 0.0  0.0   0:02.44 kswapd0

El sumario del sistema contiene mucho material bueno. Aquí tenemos un resumen:

Tabla 10-3: Campos de información de top
Columna Campo Significado
1 top Nombre del programa.


14:59:20 Hora actual del día.


up 6:30 Esto se llama uptime. Es la cantidad de tiempo desde que la máquina fue arrancada. En este ejemplo, el sistema ha estado funcionando seis horas y media.


2 users Hay dos usuarios logueados.


Load average: Load average se refiere al número de procesos que están esperando para funcionar, es decir, el número de procesos que están en un estado ejecutable y están compartiendo la CPU. Se muestran tres valores, cada uno para un periodo de tiempo diferente. El primero es la media de los últimos 60 segundos, el siguiente los 5 minutos anteriores, y finalmente los últimos 15 minutos. Los valores menores de 1.0 indican que la máquina no está ocupada
2 Tasks: Resume el número de procesos y sus distintos estados de proceso.
3 Cpu(s): Esta fila describe el carácter de las actividades que la CPU está realizando.


0.7%us El 0.7% de la CPU está siendo usada por procesos de usuario. Esto significa que son procesos fuera del propio kernel.


1.0%sy El 1.0% de la CPU está siendo usada por procesos “del sistema (kernel)”


0.0%ni El 0.0% de la CPU está siendo usada por procesos “amables” (de baja prioridad).


98.3%id El 98.3% de la CPU está desocupada.


0.0%wa 0.0% de la CPU está esperando E/S.
4 Mem: Muestra cómo está siendo usada la memoria física RAM.
5 Swap: Muestra cómo está siendo usado el espacio de intercambio (swap space) (memoria virtual).

El programa top acepta comandos de teclado. Los dos más interesantes son h, que muestra la pantalla de ayuda del programa, y q, que cierra top.

Los dos principales entornos de escritorio proveen aplicaciones gráficas que muestran información similar a top (de la misma forma que lo hace el Administrador de Tareas de Windows), pero encuentro que top es mejor que las versiones gráficas porque es más rápido y consume muchos menos recursos del sistema. Después de todo, nuestro programa de monitorización no debería ser la causa, la cual estamos intentando encontrar, de la lentitud del sistema.

viernes, 16 de octubre de 2015

Viendo los procesos

El comando más comúnmente usado para ver procesos (hay varios) es ps. El programa ps tiene un montón de opciones, pero en su forma más simple se usa así:

[me@linuxbox ~]$ ps
  PID TTY       TIME CMD
 5198 pts/1 00:00:00 bash
10129 pts/1 00:00:00 ps

El resultado de este ejemplo es un lista de dos procesos, el proceso 5198 y el proceso 10129, que son bash y ps respectivamente. Como podemos ver, por defecto, ps no nos muestra mucho, sólo los procesos asociados a la sesión de terminal actual. Para ver más, necesitamos añadir algunas opciones, pero antes de hacerlo, veamos los otros campos producidos por ps. TTY es la abreviatura de “Teletype”, y se refiere al terminal que controla el proceso. Unix muestra su edad aquí. El campo TIME es la cantidad de tiempo de CPU consumido por el proceso. Como podemos ver, ninguno de los procesos hace al ordenador trabajar mucho.

Si añadimos una opción, podemos tener una imagen más amplia de qué está haciendo el sistema:

[me@linuxbox ~]$ ps x
PID   TTY STAT TIME COMMAND
2799  ?   Ssl  0:00 /usr/libexec/bonobo-activation-server –ac
2820  ?   Sl   0:01 /usr/libexec/evolution-data-server-1.10 --
15647 ?   Ss   0:00 /bin/sh /usr/bin/startkde
15751 ?   Ss   0:00 /usr/bin/ssh-agent /usr/bin/dbus-launch --
15754 ?   S    0:00 /usr/bin/dbus-launch --exit-with-session
15755 ?   Ss   0:01 /bin/dbus-daemon --fork --print-pid 4 –pr
15774 ?   Ss   0:02 /usr/bin/gpg-agent -s –daemon
15793 ?   S    0:00 start_kdeinit --new-startup +kcminit_start
15794 ?   Ss   0:00 kdeinit Running...
15797 ?   S    0:00 dcopserver –nosid



y muchos más...

Añadiendo la opción “x” (fíjate que no lleva un guión delante) le decimos a ps que muestre todos nuestros procesos independientemente de qué terminal (si hay alguno) los controla. La presencia de un “?” en la columna TTY indica que ningún terminal controla. Usando esta opción, vemos una lista de cada proceso que tenemos.

Como el sistema está ejecutando muchos procesos, ps produce una lista larga. A menudo ayuda pasar la salida de ps por una tubería a less para verlo más fácilmente. Algunas combinaciones de opciones también producen largas líneas de salida, así que maximizar la ventana del emulador de terminal también puede ser una buena idea.

Una nueva columna llamada STAT se ha añadido a la salida. STAT es una abreviatura de “state” y revela el estado actual del proceso:

Tabla 10-1: Estado de los procesos
Estado Significado
R Funcionando (running). Significa que el proceso está en ejecución o preparado para ser ejecutado.
S Durmiendo (Sleeping). El proceso no está ejecutándose; en su lugar, está esperando a un evento, como una pulsación de teclado o un paquete de red.
D Sueño ininterrumpible. El proceso está esperando una E/S como una unidad de disco.
T Parado. Se le ha ordenado al proceso que pare. Veremos más sobre esto más tarde.
Z Proceso extinto o “zombie”. Es un proceso hijo que ha terminado, pero no ha sido limpiado por su padre.
< Un proceso de alta prioridad. Es posible dar más importancia a un proceso, dándole más tiempo en la CPU. Esta propiedad de un proceso se llama niceness (amabilidad). Un proceso con alta prioridad se dice que es menos "amable" porque está utilizando más tiempo de la CPU, lo que deja menos tiempo para todos los demás.
N Un proceso de baja prioridad. Un proceso con baja prioridad (un proceso “amable”) sólo ocupará tiempo de procesador después de que otros procesos con mayor prioridad hayan sido servidos.

El estado del proceso puede ir seguido de otros caracteres. Esto indica varias características exóticas de los procesos. Mira la man page de ps para más detalles.

Otro popular grupo de opciones es “aux” (sin guión delante). Nos da incluso más información:

[me@linuxbox ~]$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1   0.0  0.0  2136 644  ?   Ss Mar05 0:31 init
root 2   0.0  0.0     0   0  ?   S< Mar05 0:00 [kt]
root 3   0.0  0.0     0   0  ?   S< Mar05 0:00 [mi]
root 4   0.0  0.0     0   0  ?   S< Mar05 0:00 [ks]
root 5   0.0  0.0     0   0  ?   S< Mar05 0:06 [wa]
root 6   0.0  0.0     0   0  ?   S< Mar05 0:36 [ev]
root 7   0.0  0.0     0   0  ?   S< Mar05 0:00 [kh]



y muchos más...

Esta configuración de opciones muestras los procesos pertenecientes a cada usuario. Usar las opciones sin el guión al principio invoca el comando con comportamiento “estilo BSD”. La versión Linux de ps puede emular el comportamiento del programa ps que se encuentra en varias implementaciones de Unix. Con estas opciones, tendemos estas columnas adicionales:

Tabla 10-2: Encabezados de Columnas en el Estilo BSD de ps
Encabezado Significado
USER ID de usuario. Es el propietario del proceso.
%CPU Uso de CPU en porcentaje.
%MEM Uso de memoria en porcentaje.
VSZ Tamaño de la memoria virtual.
RSS Tamaño de configuración residente (Resident Set Size). La cantidad de memoria física (RAM) que el proceso usa en kilobytes.
START Hora en que comenzó el proceso. Para valores de más de 24 horas, se usa la fecha.

miércoles, 14 de octubre de 2015

Cómo funciona un proceso

Cuando un sistema arranca, el kernel inicia, como procesos, algunas de sus actividades y arranca un programa llamado init. init, a su vez, ejecuta una serie de scripts de shell (localizados en /etc) llamados init scripts, que arrancan todos los servicios del sistema. Muchos de estos servicios son implementados como daemon programs (demonios), programas que simplemente se sitúan en segundo plano y hacen su trabajo sin tener ninguna interfaz de usuario. Así que incluso sin que estemos logueados, el sistema está un poco ocupado haciendo tareas rutinarias.

El hecho de que un programa pueda arrancar otros programas se expresa en el esquema de procesos como procesos padres (parent process) produciendo procesos hijos (child process).

El kernel mantiene información sobre cada proceso para ayudar a tener las cosas organizadas. Por ejemplo, cada proceso tiene asignado un número llamado process ID o PID. Los PIDs son asignados en orden creciente, con init siempre ocupando el PID 1. El kernel también mantiene un registro de la memoria asignada a cada proceso, así como la disponibilidad de los procesos para reanudar la ejecución. Como los archivos, los procesos también tienen propietarios e IDs de usuario, IDs efectivas de usuarios, etc.

lunes, 12 de octubre de 2015

Procesos

Los sistemas operativos modernos son normalmente multitarea, lo que significa que crean la ilusión de que hacen más de una cosa al mismo tiempo mediante un rápido cambio de un programa en ejecución a otro. El kernel Linux gestiona esto a través del uso de procesos. Los procesos son la forma en que Linux organiza los diferentes programas que esperan su turno en la CPU.

Algunas veces un ordenador se vuelve lento o una aplicación deja de responder. En este capítulo, veremos algunas de las herramientas disponibles en la línea de comandos que nos permitirán examinar qué están haciendo los programas, y cómo terminar procesos que están teniendo un mal comportamiento.

Este capítulo presentará los siguientes comandos:
  • ps – Muestra un listado de los procesos en funcionamiento
  • top – Muestra las tareas
  • jobs – Lista los trabajos activos
  • bg – Coloca un trabajo en segundo plano (background)
  • fg – Coloca un trabajo en primer plano (foreground)
  • kill – Manda una  señal a un proceso
  • killall – Mata procesos por nombre
  • shutdown – Apaga o reinicia el sistema

viernes, 9 de octubre de 2015

Para saber más

Hay numerosos programas de línea de comandos para crear y mantener usuarios y grupos. Para más información, mira las man pages de los siguientes comandos:
  • adduser
  • useradd
  • groupadd

miércoles, 7 de octubre de 2015

Resumiendo

En este capítulo hemos visto cómo los sistemas tipo Unix, por ejemplo Linux, manejan los permisos de usuario para permitirles acceso para leer, escribir y ejecutar archivos y directorios. La idea básica de este sistema de permisos viene de los primeros días de Unix y se han mantenido muy bien con el paso del tiempo. Pero el mecanismo nativo de permisos en los sistemas tipo Unix carece del nivel de detalle de los sistemas más modernos.

lunes, 5 de octubre de 2015

Cambiando tu contraseña

El último asunto que veremos en este capítulo es establecer contraseñas para tí mismo (y para otros usuarios si tienes acceso a privilegios de superusuario). Para establecer o cambiar una contraseña, se usa el comando passwd. La sintaxis del comando es así:

passwd [usuario]

Para cambiar tu contraseña, sólo introduce el comando passwd. Serás preguntado por tu contraseña anterior y por la nueva:

[me@linuxbox ~]$ passwd
(current) UNIX password:
New UNIX password:

El comando passwd tratará de obligarte a usar contraseñas “fuertes”. Esto significa que rechazará contraseñas que son muy cortas, muy parecidas a contraseñas anteriores, palabras del diccionario, o muy fácilmente adivinables:

[me@linuxbox ~]$ passwd
(current) UNIX password:
New UNIX password:
BAD PASSWORD: is too similar to the old one
New UNIX password:
BAD PASSWORD: it is WAY too short
New UNIX password:
BAD PASSWORD: it is based on a dictionary word

Si tienes privilegios de superusuario, puedes especificar un nombre de usuario como argumento en el comando passwd para establecer la contraseña de otro usuario. Hay otras opciones disponibles para el superusuario como, el bloqueo de cuentas, caducidad de la contraseña, etc. Mira la man page de passwd para más detalles.

viernes, 2 de octubre de 2015

Ejercitando nuestros privilegios

Ahora que hemos aprendido cómo funciona esto de los permisos, es hora de lucirse. Vamos a demostrar la solución a un problema común, configurar un directorio compartido. Imaginemos que tenemos dos usuarios llamados “bill” y “karen”. Ambos tienen colecciones de CDs de música y les gustaría crear un directorio compartido, donde cada uno guarde sus archivos de música como Ogg Vorbis o MP3. El usuario bill tiene acceso a privilegios de superusuario vía sudo.

La primera cosa que tiene que ocurrir es crear un grupo que tenga a bill y a karen como miembros. Usando la herramienta gráfica de gestión de usuarios, bill crea un grupo llamado music y le añade los usuarios bill y karen:

Figura 3: Creando un nuevo grupo con GNOME

A continuación, bill crea el directorio para los archivos de música:

[bill@linuxbox ~]$ sudo mkdir /usr/local/share/Music
Password:

Como bill está manipulando archivos fuera de su directorio home, requiere privilegios de superusuario. Después de crear el directorio, tendrá los siguientes propietarios y permisos:

[bill@linuxbox ~]$ ls -ld /usr/local/share/Music
drwxr-xr-x 2 root root 4096 2008-03-21 18:05 /usr/local/share/Music

Como podemos ver, el directorio tiene como propietario al root y tiene permisos 755. Para hacer que este directorio se pueda compartir, bill necesita cambiar el grupo propietario y sus permisos para permitir la escritura:

[bill@linuxbox ~]$ sudo chown :music /usr/local/share/Music
[bill@linuxbox ~]$ sudo chmod 775 /usr/local/share/Music
[bill@linuxbox ~]$ ls -ld /usr/local/share/Music
drwxrwxr-x 2 root music 4096 2008-03-21 18:05 /usr/local/share/Music

¿Pero qué significa todo esto? Significa que ahora tenemos un directorio, /usr/local/share/Music cuyo propietario es root y permite acceso de lectura y escritura al grupo music. El grupo music tiene como miembros a bill y karen, tanto bill como karen pueden crear archivos en el directorio /usr/local/share/Music. Otros usuarios pueden listar el contenido del directorio pero no pueden crear archivos dentro.

Pero aún tenemos un problema. Con los permisos actuales, los archivos y directorios creados en el directorio Music tendrán los permisos normales de los usuarios bill y karen:

[bill@linuxbox ~]$ > /usr/local/share/Music/test_file
[bill@linuxbox ~]$ ls -l /usr/local/share/Music
-rw-r--r-- 1 bill bill 0 2008-03-24 20:03 test_file

Realmente tenemos dos problemas. Primero, la umask en este sistema es 0022 la cual evita que los miembros del grupo puedan escribir en archivos pertenecientes a otros miembros del grupo. Esto no sería un problema si el directorio compartido sólo contuviera archivos, pero como este directorio contendrá música, y la música suele organizarse en una jerarquía de artistas y álbumes, los miembros del grupo necesitarán la capacidad de crear archivos y directorios dentro de los directorios creados por otros miembros. Necesitamos modificar la umask utilizada por bill y karen a 0002.

Segundo, cada archivo y directorio creado por un miembro será adjudicado al grupo primario del usuario en lugar de al grupo music. Esto se puede arreglar estableciendo el setgid bit en el directorio:

[bill@linuxbox ~]$ sudo chmod g+s /usr/local/share/Music
[bill@linuxbox ~]$ ls -ld /usr/local/share/Music
drwxrwsr-x 2 root music 4096 2008-03-24 20:03 /usr/local/share/Music

Ahora probaremos a ver si los nuevos permisos arreglan el problema. bill establece su umask a 0002, elimina el anterior archivo de prueba, y crea un nuevo archivo y directorio de pruebas:

[bill@linuxbox ~]$ umask 0002
[bill@linuxbox ~]$ rm /usr/local/share/Music/test_file
[bill@linuxbox ~]$ > /usr/local/share/Music/test_file
[bill@linuxbox ~]$ mkdir /usr/local/share/Music/test_dir
[bill@linuxbox ~]$ ls -l /usr/local/share/Music
drwxrwsr-x 2 bill music 4096 2008-03-24 20:24 test_dir
-rw-rw-r-- 1 bill music 0 2008-03-24 20:22 test_file
[bill@linuxbox ~]$

Tanto archivos como directorios se crean ahora con los permisos correctos para permitir a todos los miembros del grupo music crear archivos y directorios dentro del directorio Music.

El único problema que queda es umask. La configuración necesaria sólo dura hasta el final de la sesión y debe ser reconfigurada. En el Capítulo 11, veremos cómo hacer el cambio a una umask permanente.