LPIC

Guía extraoficial de estudio

Administración básica de ficheros

Antes de empezar a trastear con los fichero debemos tener en cuenta un par de cosas. La primera, es que a diferencia de otros sistemas operativos, para Linux “fichero1.txt” y “Fichero1.txt” son ficheros distintos. Linux distingue entre mayúsculas y minúsculas. La segunda es que la mayoría de los comandos aceptan “comodines”, que nos gestionar los ficheros. Tenemos 3 clases de comodines:

Opción Resultado
? Representa un solo carácter. Por ejemplo, s?l podría ser sol, sal o cualquier otro nombre de fichero que empiece por s  termine por l.
* El funcionamiento de asterisco es similar, solo que no determina el numero de caracteres que queremos. Es decir, volviendo al ejemplo de antes, s*l podría ser sol o soaeiuol. Si buscáramos con esa expresión, nos devolvería todos los ficheros que empiecen por s y acaben por l.
[] Se usan para determinar rangos. s[a-w]l podria ser valido para cualquier fichero que empiece por s, contenga cualquier letra del abecedario excepto la z, pues la hemos dejado fuera del rango, y acabe por l.

Destruir procesos

El comando kill

Cuando queramos finalizar un proceso en ejecución, el comando a utilizar es kill. Este programa lo que hace es enviar una señal al proceso. Podemos ver las señales poniendo el flag –l al comando.

kill -l

kill -l

Podemos especificar la señal empleando el número o el nombre de la misma. Las señales más utilizadas son la 1 (finaliza los programas interactivos y hace que muchos demonios vuelvan a leer sus ficheros de configuración), la 9 (hace que el proceso termine “a la fuerza”) y 15 (hace que el proceso termine pero permite cerrar ficheros abiertos, etc).Esta última es la señal por defecto si no especificamos señal.

El programa kill solo destruirá los procesos del usuario que los ejecuta, a excepción de root.

Una variante de este comando es killall. Permite destruir procesos en base a su nombre, en lugar del PID. Por ejemplo, killall vi, destruirá todos los procesos llamados vi.

Al igual que con kill, con –s, podemos especificar la señal que queremos usar. Una opción importante para killall es –i, que permite destruir procesos de forma interactiva:

[super@localhost ~]$ killall -15 -i vim
Kill vim(2531) ? (y/N)

Tanto kill como en killall admiten dos sintaxis para destruir un proceso:

kill –s señal PID
kill –numero_señal PID
killall –s señal nombre_proceso
killall –numero_señal nombre_proceso

además killall admite:

killall – –signal señal nombre_proceso

Administrar las prioridades de los procesos

Priorizar un proceso

Es posible administrar la prioridad con la que se ejecutan los procesos de nuestro sistema, con el objetivo de priorizar el uso de la cpu a ciertos programas. Los comandos para realizar estas acciones son nice y renice. Utilizamos nice para ejecutar un programa indicando la prioridad que queremos que tenga y renice para modificarla de un programa ya en ejecución.

Podemos usar nice de tres maneras distintas:

  • Indicando la prioridad después de un guión (solo para prioridades positivas).
  • Indicando la prioridad después del flag -n.
  • Indicando la prioridad después del parámetro –adjustement=.
nice -12 vi hola.txt
nice -n 12 vi hola.txt
nice –adjustement=12 vi hola.txt

Si omitimos el valor de regulación, nice utilizará por defecto la 10. Cuando ejecutamos un programa sin nice, su prioridad es de 0. El rango de valores es de -20 a 19, siendo los valores negativos los que tienen una prioridad mas alta. Solamente con el usuario root podemos iniciar un programa que una prioridad negativa.

El comando renice tiene la siguiente sintaxis:

renice prioridad [[-p] pids] [[-g] pgrps] [[-u] usuarios]

Donde pids son los id de los procesos, pgrps los ids de los grupos y usuarios el nombre o nombres de los usuarios. Cuando queramos restablecer la prioridad para un determinado grupo o usuarios, debemos tener en cuenta que solo root puede realizar esta acción.

Un ejemplo:

renice 3 -p 12122 31313 -u antonio maria

Establecemos la prioridad 3 para los procesos 12122 y 31313 para los usuarios antonio y maria.

Procesos en primer y segundo plano

Normalmente, cuando se inicia un programa, este toma el control del terminal, impidiendo realizar otras tareas. Para solucionar dicho problema, existe la posibilidad de poder pasar los procesos de primer plano a segundo plano.

Ejemplo:

[super@localhost ~]$ vi la hola.txt

vi

Se nos abre el vim en el terminal y no podemos hacer otra cosa que no sea editar hola.txtPulsamos control-z para pausar el proceso y regresar al terminal. 

Este proceso suspende el programa, por lo que la tarea que este realizando, también la detiene. En este caso no tiene importancia porque estamos editando un documento, pero podría tenerla según el proceso pausado.

El terminal nos muestra el siguiente mensaje:

[1]+  Detenido                vimhola.txt

Ejecutamos la siguiente orden para ver el proceso y su estado:

[super@localhost ~]$ psaux | grepvim

super     2649  0.0  0.0 155000  3540 pts/0    T    17:09   0:00 vimhola.txt

Ahora si queremos volver al editor, debemos usar el comando fg (foreground)Si tuviéramos más de un proceso detenido, deberemos utilizar este comando con un número (fg 2, fg 3, ….). Para saber que numero va asociado a cada proceso detenido, tenemos el comando jobs

[super@localhost ~]$ jobs

[1]-  Detenido                vimhola.txt

[2]+  Detenido                vimadios.txt

La forma de pasar un proceso a segundo plano, para que así el proceso vuelva a estado de ejecución, es mediante el comandobg (background):

[super@localhost~]$ bg 2

No obstante, la manera más cómoda de ejecutar un programa en segundo plano, sin tener que pararlo con control-zy luego usar la orden bg, es con el &. Podemos ejecutar un un programa en segundo plano de la siguiente forma:

[super@localhost ~]$ vi ola &

[3] 2772

Technorati Tags

Comando top

El administrador de tareas de Linux

Este comando es una variante dinámica de ps. Es utilizado cuando queremos saber cuanto tiempo de CPU consumen los procesos, y poder comparar unos con otros. Como vemos en la siguiente imagen, ordena las entradas por el uso de la CPU y actualiza los datos cada pocos segundos, por lo que la convierte en una buena herramienta para localizar procesos descontrolados.

top

 

 

Opciones de top:

Opción Resultado
-d retardo Especificamos el tiempo que tardan en refrescarse los datos.
-p pid Se usa para monitorizar determinados procesos. Las PID las podemos obtener mediante el comando ps . Admite hasta 20 PID.
-n iter Para que top muestre un determinado numero de actualizaciones.
-b Suele contener la fecha y hora de la compilación del kernel

Además, mientras está en ejecución, top admite una serie de comandos:

Opción Resultado
h o ? Nos muestra la información de ayuda.
k Después de introducir el PID, intentará destruir el proceso.
q Sale de top.
r Permite cambiar la prioridad de un proceso, que por defecto es 0. Nos pedirá un número PID y y un nuevo valor para la prioridad (positivo lo reduce y negativo lo aumenta). Solo root puede incrementar la prioridad.
s Nos pie la velocidad en segundos, y es el tiempo que tardan en actualizarse los datos.
P Los datos mostrados se ordenan por el uso de la CPU, que es la configuración por defecto.
M Los datos se ordenan por el uso de la memoria.

_

Un dato importante que proporciona top es la carga media (load average), parámetro que indica la demanda de tiempo de la CPU que utilizan los procesos. En la captura de top, más arriba, puedes ver tres cargas medias: 0.29, 0.57 y 0.36, que corresponden a la carga media actual y a las dos anteriores. Un sistema donde los programas no demandan tiempo de CPU la carga media es de 0, mientras que uno que si demanda, es de 1. Si un sistema suele tener una carga media de 0.5, por ejemplo, pero de repente se sitúa en 2,5, puede que haya procesos colgados que estén acaparando la CPU. Un comando útil para ver la carga media del PC, así como el tiempo que lleva encendido, es uptime.

Comando ps

Las opciones de ps

Este programa muestra el estado de los procesos. Admite muchas opciones útiles y sirve para monitorizar procesos. Para el que venga de windows, podríamos decir que es como el “Administrador de tareas” que aparece al presionar ctrl+alt+supr. Su sintaxis es muy sencilla:

ps [opciones]

Si no añadimos opciones, ps muestra los procesos del usuario con el que estamos logueado. No es necesario colocar espacios entre las opciones, ya que se pueden agrupar, por ejemplo, en lugar de poner ps -a -f, podríamos poner ps -af.

Como siempre, para conecer todas las opciones y posibilidades del programa deberemos consultar el manual (man ps). Además, se nos muestran varios ejemplos que podrian sernos de utilidad:

To print a process tree:
ps -ejH
ps axjf
To get info about threads:
ps -eLf
ps axms
To get security info:
ps -eo euser,ruser,suser,fuser,f,comm,label
ps axZ
ps -eM

Entre algunas de las características mas útiles tenemos:

Opción Resultado
–help Muestra la ayuda.
-A o -e Hacen que se muestren todos los procesos del sistema. Si le adjuntamos la opcion x, muestra todos los procesos que pertenecen al usuario que ejecuta el comando, además de incrementar la cantidad de información que se muestra de cada proceso.
-u usuario muestran los procesos que pertenecen al usuario en concreto.
-H , -f y –forest Muestra la jerarquía de procesos, útiles si intentamos averiguar los parentescos de los procesos.
-w Esta opción es utilizada para mostrar una salida mas ancha, ya que ps trunca su salida para que se adapte a su pantalla.. Con ps w>ps.txt, redirigimos la salida a un fichero, y lo abrimos que un editor de texto que admita lineas mas anchas.
-f, -l, j, l, u y v Se utilizan para ampliar la información proporcionada en la salida ps.

Podemos combinar estas opciones de muchas maneras para obtener los resultados deseados. Una de las combinaciones mas útililes para el “dia a dia” podria ser:

ps -aux

que nos muestra los procesos de todos los usuarios con infomación añadida:

 

Interpretar la salida de ps

Es importante saber interpretar los campos mostrados por la anterior imagen. Como podemos observar, la salida de ps comienza por un encabezado. Describamos esos campos:

Campo Descripción
USER Nombre de usuario que ejecuta el programa.
PID Número encargado de identificar el proceso. Es importante ya que lo necesitamos para modificar o destruir el proceso.
%CPU Porcentaje total de tiempo de CPU que utiliza el proceso cuando se utiliza ps.
%MEM Porcentaje de memoria utilizada por el proceso.
VSZ Tamaño total del proceso en la memoria virtual, en kilobytes.
RSS Cantidad de memoria utilizada por el proceso.
TTY Código que se utiliza para identifica el terminal. No todos los procesos tienen TTY.
STAT Muestra información acerca del estado del proceso (ver estado de un proceso Unix).
START Indica la hora de ejecución.
TIME Cantidad total de tiempo de CPU consumido.
COMAND Comando utilizado para iniciar el proceso.

 

Estado de un proceso Unix

  • Preparado (R).- Runnable. Está preparado para la ejecución.
  • Zombie (Z).- Todo proceso al finalizar avisa a su proceso padre, para que éste elimine su entrada de la tabla de procesos. En el caso de que el padre, por algún motivo, no reciba esta comunicación no lo elimina de la tabla de procesos. En este caso, el proceso hijo queda en estado zombie, no está consumiendo CPU, pero sí continua consumiendo recursos del sistema.
  • Ejecutando (O).- Sólo uno de los procesos preparados se está ejecutando (para sistemas monoprocesador).
  • Parado (T).- (traced) Un proceso parado. Pasará a estar preparado en cuanto vuelva a recibir la señal.
  • Suspendido (S).- Un proceso se encuentra suspendido si no entra en el reparto de CPU, ya que se encuentra esperando algún tipo de evento (por ejemplo, la recepción de una señal software o hardware). En cuanto dicho evento se produce, el proceso pasa a formar parte del conjunto de procesos preparados.

Comando uname: conocer el kernel

Podemos definir el concepto “kernel” como el corazón de nuestro sistema operativo Linux. Entre las funciones más importantes se encuentran:

  • Administración de la memoria para todos los programas y procesos en ejecución.
  • Administración del tiempo que se tarda en procesador los programas.
  • Es el encargado de que podamos acceder a los periféricos/elementos de nuestro ordenador de una manera cómoda.

Aunque no podemos administrar este proceso en la misma medida que el resto, con uname si podemos obtener información sobre éste. Como siempre, veremos algunas de sus opciones y después ejemplos.

Opción Resultado
-n –nodename Nos muestra el nombre del equipo en la red
-s –kernel-name Devuelve el nombre del kernel, suele ser Linux
-v –kernel-version Suele contener la fecha y hora de la compilación del kernel
-r –kernel-release Número de la versión del kernel
-m –machine Devuelve información sobre la máquina (arquitectura)
-p –processor En teoría retorna información sobre la CPU (fabricante, modelo, etc), pero en la práctica suele devolver unknown, o como en mi caso lo mismo que la opción –m (x86_84)
-o –opertating-system Nombre del sistema operativo
a –all muestra toda la información disponible

Ejemplo:

[super@localhost ~]$ uname -a
Linux localhost.localdomain 3.3.1-3.fc16.x86_64 #1 SMP Wed Apr 4 18:08:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

podemos combinar los parámetros que queramos con tal de adquirir la información deseada:

[super@localhost ~]$ uname -pro
3.3.1-3.fc16.x86_64 x86_64 GNU/Linux

En la práctica, dicho comando es utilizado en scripts multiplataforma que utilicen estas opciones para adquirir información y así ajustar sus acciones al sistema en que se ejecuta.

Comando sed

Sed

Este comando modifica directamente el contenido del fichero, enviándolo a la salida estándar.

Su sintaxis puede adoptar dos formas:

sed [opciones] -f fichero-script [fichero-entrada]
sed [opciones] texto-script [fichero-entrada]

Fichero-entrada será en nombre del fichero que se desea modificar. Texto-script o fichero-script, son el conjunto de comandos que queremos que ejecute sed.

Veamos algunos de los comandos de sed que puede emplear en sus scripts. El campo direcciones, hace referencia a los números de linea. Pueden no recibir direcciones, en cuyo caso se opera con el fichero completo. Si se recibe una dirección, se opera sobre la linea especificada. Si se reciben dos direcciones ( un rango ), se opera sobre dicho rango de lineas, ambas inclusive.

Comando Direcciones significado
= 0 o 1 Muestra el número de linea actual.
a\ texto 0 o 1
Añade el texto al fichero.

i\texto
0 o 1 Inserta el texto en el fichero.
r fichero 0 o 1 añade el texto del fichero indicado en el fichero.
c\texto rango Reemplaza el rango de lineas seleccionado con el texto proporcionado.
s/regexp/sustituto rango Reemplaza el texto que coincida con la expresión regular por el sustituto.
w fichero rango Escribe el espacio de patrones actual en el fichero especificado.
q 0 o 1 Finaliza de inmediato el script, pero imprime el espacio de patrones actual.
Q 0 o 1 Finaliza de inmediato el script.

Un ejemplo para dicho comando podría ser el siguiente:

sed ‘s/2008/2009/’ cal-2008.txt > cal-2009.txt

la idea de este ejemplo es convertir rápidamente un fichero creado para el 2008 para que se pueda utilizar en el 2009.

Sed reemplazará la primera aparición de 2008 de cada linea por 2009 y lo canaliza al fichero cal-2009.txt.

Comando grep

Grep

Este comando nos permite el uso de expresiones regulares para la búsqueda de archivos. Veamos algunas de las opciones más importantes:

Flag Acción
-c o –count Contar lineas coincidentes
-i o –ignore-case Ignorar entre mayúsculas y minúsculas
-r –recursive Buscar recursivamente
-f o –file=fichero Especifica el fichero de entrada
-E o — extended-regexp Utilizar una expresión regular extendida

La sintaxis del comando es:

grep [opciones] regexp [ficheros]

Donde “regexp” es el conjunto de expresiones regulares

Un ejemplo sencillo podría ser el siguiente:

grep -r eth0 /etc/*

Dicha orden buscará en el directorio /etc/ y en TODAS sus subcarpetas todos los ficheros que contengan la cadena “eth0”.

Dado que los usuarios normales no pueden acceder a determinados ficheros de /etc/, es posible que al probar la orden os devuelva algún error. Para solucionar esto, o bien probamos la orden como root, o redirigimos los errores a “/dev/null”

A continuación algunos ejemplos más complicados:

grep -r eth[01] /etc/*

Mostrará los ficheros que contengan la cadena eth0 y etho1.

grep -E “(www.\ejemplo\.es|www.\ejemplo2\.com” /etc/*

Se nos muestran todos los ficheros del directorio /etc/ y sus subdirectorios que contengan las cadenas http://www.ejemplo.es o http://www.ejemplo2.com

Se deben entrecomillar ciertas expresiones regulares para que la consola no las intente analizar como un comando propio.

Ahora usaremos el grep junto con otro comando:
<div style=”background-color: #e0e0e0; padding: 1.2em 1.2em 1.2em 61px;”ps ax | grep xterm

Muestra todos los procesos en ejecución llamados “xterm”

Las expresiones regulares

El shell nos proporciona una característica que nos ahorra tiempo a la hora de teclear nombre de ficheros con los que operan comandos. La característica se llama generación de ficheros o expansión de nombres y permite utilizar caracteres especiales para especificar grupos de nombres de ficheros.

Podemos encontrar nombre de ficheros que cumplen un determinado patrón, como por ejemplo los que acaben en “.txt” o los que empiecen por “fichero” o los que tienen 3 caracteres. Veamos los tipos de esprexion regular:

Caracteres especiales utilizados:

Carácter Resultado Ejemplo
 . Representa cualquier carácter único, excepto el salto de linea El comando “ls o.o mostrará los ficheros que empiecen por o, contenga cualquier otra letra, y termine por o (oso, oco, olo..).
^ Representa el comienzo de una linea cat /etc/passwd | grep ^u nos devolverá las lineas del fichero que empiecen por “u”.
$ Representa el final de una linea cat /etc/passwd | grep “bash$” nos devolverá las lineas del fichero que acaben en “bash”.
| Separa dos posibles coincidencias hola | adios coincide con hola y adiós
() Rodean subexpresiones. Es utilizado para asegurarse de las expresiones que rodean sean tratadas como un grupo. grep “\(us\)\+” passwd nos devolverá todas las coincidencias que encuentre con la cadena “us“.
\ Si se antepone a un carácter especial, este será tratado como un carácter normal.  Para que la cadena http://www.google.com  sea tratada como
tal, deberemos indica www\.google\.com.
Sino, el punto podria ser igual a cualquier carácter, y nos podría devolver, por ejemplo, wwwagoogleacom.


Expresiones entre corchetes:

 Las expresiones que contengan caracteres rodeados entre corchetes, nos devolverán las cadenas que coincidan con cualquiera de las letras que estén entre los mismos. Por ejemplo, el comando ls C[AEIOU]L nos va a mostar todos los archivos que tengamos en el directorio que se llamen cal, cel, cil, col y cul, y el comando ls [a-zA-z], todos los ficheros que empiecen por minúscula o mayúscula.

Expresión regular Resultado
[] Coincidencia con cualquiera de los caracteres cerrados
[! ] Coincidencia con cualquiera de los caraceres no cerrados
[ – ] Coincidencia con cualquiera de los caracteres del rango

Operadores de repetición:

Se trata de símbolos especiales que se utilizan para denotar cuantas veces debe aparecer un elemento coincidente.

Símbolo Resultado
? Especifica cero o una coincidencia
* Especifica cero o más ocurrencias
+ Coincide con una o mas apariciones

Ejemplos:

La expresión A?B, nos podrá coincidir con AEB, ACB, AB, …..

La expresión version10.*, nos podra coincidir con version101,version102, version1000 ….etc