Procesos (LINUX)

PROCESOS

Cada proceso en UNIX tiene asociado un número que lo identifica. Este número es asignado por el núcleo, y se denomina identificador de proceso o PID (process identitifier). Además del PID los procesos tienen asignado otro número denominado PPID (parent PID), que identifica el proceso padre.
Todo proceso, desde que se inicia hasta que termina, va pasando por una serie de estados, cada uno con unas características determinadas.
Estados:

  1. El proceso se está ejecutando. En máquinas con un sólo procesador sólo puede haber un proceso en ese estado. UNIX permite que la CPU sea compartida por varios procesos, dividiendo todo el tiempo del procesador en cuantos o rodajas, y asignado esos cuantos alternativamente a cada proceso, acorde con su prioridad.
  2. El proceso está durmiendo. Un proceso entra en este estado cuando no puede proseguir su ejecución por faltarle algún recurso o porque está esperando la terminación de una operación de entrada salida.
  3. El proceso no dispone del procesador, pero está listo para ejecutarse. Continuará su ejecución en cuanto se lo indique el planificador de la CPU.

Como hemos visto es posible ejecutar varios procesos de forma que parece que lo hacen simultáneamente, si estamos en la consola y ejecutamos un programa este no devuelve el prompt del shell hasta que no finaliza su proceso, para permitir que podamos ejecutar otros procesos será necesario enviar este primer proceso a segundo plano, lo cual se puede hacer de dos formas.

  1. Una vez que está en marcha pulsar ctrl+z lo que hará aparecer de nuevo el prompt y dejará el proceso en suspenso. Si queremos ponerlo en marcha debemos utilizar el comando bg <numero> donde numero indica el proceso que queremos pasar a segundo plano. Si en lugar de bg utilizamos fg <numero> lo que haremos será traer el proceso a primer plano y no podremos hacer otra cosa hasta que lo enviemos a segundo plano o lo paremos.
  2. Ejecutar un comando terminando la línea de orden con el símbolo &, el cual le indica al shell que ejecute la orden y que la pase a segundo plano.

Para saber que procesos se están ejecutando en un instante determinado podemos emplear la orden ps.
Si ejecutamos ps sin opciones nos devolverá los procesos asociados a nuestro terminal.

Para obtener más información debemos usar las distintas opciones que nos permite la orden ps aquí se exponen algunas de las más usadas.

-e         nos informa de todos los procesos que hay en el sistema.
-f         proporciona una lista completa de cada proceso.
-l          da listados largos y completos que contienen muchos detalles de los procesos
-a         muestra los procesos de otros usuarios.
-A        muestra todos los procesos
-x         muestra procesos sin ningún terminal asociado
-u         muestra el usuario y el tiempo de inicio.

Ejemplos:


USER              Usuario propietario del proceso.
PID                 Identificador del proceso.
%CPU             % de uso de los recursos de la CPU
%MEM           % de memoria utilizada.
VSZ                indica la cantidad de kilobytes del programa en la memoria virtual.
RSS                 indica la cantidad del kilobytes del programa en memoria.
TTY                terminal de control asociado al proceso.
STAT              información acerca del estado del proceso. R: listo; S: durmiendo; T: detenido; Z:                               Zombie (su proceso padre no los detuvo apropiadamente).
START            Hora de inicio del proceso.
TIME              Tiempo que lleva ejecutándose
COMMAND  Nombre del programa que contiene la imagen del proceso.

Otra orden que nos permite estudiar los procesos en ejecución es top.
También puede resultar muy útil utilizar la orden pstree que nos mostrará los procesos en forma de árbol permitiendo ver las dependencias de procesos padre e hijos.

Para enviar señales a los procesos en ejecución se utiliza la orden kill cuya sintaxis es:

kill -señal PID           Envia la señal al proceso indicado por PID.

Cuando un proceso recibe una señal puede actuar de tres formas diferentes:

  1. Ignorar la señal
  2. Invocar a la rutina de tratamiento por defecto proporcionada por el núcleo.
  3. Invocar una rutina propia que se encargará de tratar dicha señal.

Cada señal tiene asociado un número entero positivo que la identifica. En el caso del UNIX System V
existen 19 diferentes, numeradas del 1 al 19.
1        SIGHUP: Es enviada a todos los procesos asociados a un mismo terminal cuando se pulsa la tecla de interrupción. Por defecto provoca la terminación de los procesos que la reciben.
2        SIGINT: Interrupción. Es enviada a todos los procesos asociados a un mismo terminal cuando se pulsa la tecla de interrupción. Por defecto provoca la terminación de los procesos que la reciben.
3        SIGQUIT: Salir. Es similar a SIGINT, pero en este caso se envía cuando pulsamos la tecla de salida Ctrl-4.
5        SIGTRAP: Es enviada cuando se ejecutan instrucciones paso a paso en un programa. Por defecto provoca la terminación de los procesos que la reciben.
6        SIGIOT: Fallo de hardware
7        SIGEMT: Fallo de hardware
8        SIGFPE: Es enviada cuando el hardware detecta un error en una operación en coma flotante. Por defecto provoca la terminación de los procesos que la reciben.
9        SIGKILL: Provoca la terminación del proceso. Esta señal no puede ser ignorada.
10        SIGBUS: Error de acceso a memoria.
11        SIGSEGV: Violación de segmentos de memoria
12        SIGSYS: No se usa
13        SIGPIPE: Intento de escritura en una tubería en la cual no hay nadie leyendo.
14        SIGALARM: Es enviada al proceso cuando alguno de sus temporizadores llega a cero. Por defecto provoca la terminación de los procesos que la reciben.
15        SIGTERM: Indica que el proceso debe terminar. Puede ser ignorada.
16        SIGUSR1: Reservada para el usuario.
17        SIGUSR2: Reservada para el usuario.
18        SIGCLD: Se envía al padre de un proceso si éste muere.
19        SIGPWR: Fallo de alimentación.

Por defecto la orden kill envía la señal 15 al proceso especificado. Si queremos eliminar el proceso definitivamente lo mejor es enviarle la señal 9.

Expresiones regulares y filtros

Expresiones regulares y filtros.

Una expresión regular es un patrón que define a un conjunto de cadenas de caracteres. Las expresiones regulares se construyen de forma análoga a las expresiones aritméticas. Existe la posibilidad de combinar expresiones simples; para ello, debemos emplear distintos operadores.
Los bloques básicos de construcción son las expresiones regulares que referencias un único carácter. La mayoría de los caracteres, incluyendo todas las letras y dígitos, son expresiones regulares que se definen a si mismos. Cualquier metacarácter con significado especial debe ser precedido del símbolo backslash para que pierda su significado especial.
Una lista de caracteres encerrados dentro de [] referencia cualquier carácter sencillo de esa lista. Si el primer carácter es un ^ entonces estaremos haciendo referencia a los caracteres que no aparecen en la lista.
Los caracteres ^ y $ son metacaracteres que representan una cadena vacía al principio y al final de la línea, respectivamente. Los símbolos < y > representan una cadena vacía al principio y al final de una palabra.
Una expresión regular que representa un carácter sencillo puede ser continuada con uno o varios caracteres de repetición.:

?El elemento precedente es opcional y debe coincidir al menos una vez.
*El elemento precedente debe coincidir cero o más veces
{n}El elemento precedente debe coincidir exactamente n veces
+El elemento precedente debe coincidir una o más veces.
{,m}El elemento precedente es opcional y debe coincidir al menos m veces.
{n,m}El elemento precedente debe coincidir al menos n veces pero no más de m veces.

Dos expresiones regulares pueden unirse con el operador |. La expresión resultante representa cualquier cadena que responda a uno de los dos patrones.
Ejemplos:

PatrónQué representa
pabloLa cadena pablo
^pabloLa cadena pablo al comienzo de una línea.
pablo$La cadena pablo al final de una línea.
^pablo$La cadena pablo formando una única línea.
niñ[oa]La cadena niño o niña
ni[^aeiou]oLa tercera letra no es una vocal minúscula.
ga.oLa tercera letra es cualquier carácter.
^….$Cualquier línea que contenga 4 caracteres.
^.Cualquier línea que comienza por punto.
^[^.]Cualquier línea que no comienza por punto.
niños*niño, niños, niñoss, niñosss, etc
“niño”niño entre comillas dobles.
“*niño”*niño con o sin comillas dobles.
[a-z][a-z]*una o más letras minúsculas.
[a-z]+una o más letras minúsculas (sólo válido en algunas aplicaciones).
[^0-9A-Z]cualquier caracter que no sea ni número ni letra mayúscula.
[a-zA-Z]cualquier letra sea mayúscula o minúscula.
[Ax5]cualquier carácter que sea A, x o 5.
niño|niña|nadauna de las tres palabras.
(s|arb)ustola palabra susto o arbusto.
ga?t[oa]gato, gata, gasto, gaita, etc.
<gacualquier palabra que empiece por ga.
 ño>cualquier palabra que termine por ño
<niño>la palabra niño
o{2,}dos o más oes en una misma fila.

Siempre que empleemos expresiones regulares con grep, deben se encerradas entre comillas dobles para que el interprete de órdenes no los considere. Si dentro de la expresión regular tenemos el metacarcter $ , deberemos emplear comillas simples en lugar de las comillas dobles.

Filtros.

sort   Sintaxis  sort [-ndt] [+campo] [archivo(s)]
Este filtro se utiliza para ordenar líneas compuestas por cmpos, separados por tabuladores, aunque podemos especificar cualquier tipo de separador de campo. Si a sort no le pasamos ningún archivo como prámetro, tomará su entrada de la entrada estándar como cualquier filtro. Con este filtro podemos ordenar las líneas de uno varios archivos según un campo en particular. Esta ordenación no produce ninguna modificación en los archivos tratados.
Algunas opciones:

-nconsidera el valor numérico para ordenar los campos.
-dconsiderar sólo espacios en blanco y caracteres alfanuméricos.
-t seputiliza sep como separador de campos.

grep                               Sintaxis            grep [-inv] patrón [archivo(s)]
Es un filtro que permite buscar cadenas de caracteres en los archivos que le indiquemos
Opciones:

-iIndica a grep que se ignoren mayúsculas y minúsculas
-vvisualiza por pantalla las líneas que no contienen el patrón indicado.
-nmuestra por pantalla el número de línea en que se encuentra el patrón.

wc                                 Sintaxis            wc [-lwc] [archivo(s)]
Se trata de un contador de líneas, palabras y caracteres.
Opciones:

-lvisualiza sólo el número de líneas.
-wvisualiza sólo el número de palabras.
-cvisualiza sólo el número de caracteres.

cut                                 Sintaxis            cut -c lista [archivo(s)]
cut -f lista [-dcar] [archivo(s)]
Se usa para cortar y pasar a la salida estándar las columnas o campos de la entrada estándar o del archivo especificado. La opción -c es para cortar columnas y -f para cortar campos. Al cortar un campo, existe la opción -d para especificar los caracteres de separación entre los distintos campos (car). Por defecto el delimitador es el tabulador, al menos que se indique otra cosa.
Una lista es una secuencia de números que se usa para indicarle a cut qué campos o columnas se quieren cortar. Hay varios formatos para esta lista.

X-YColumnas o campos desde X hasta Y inclusive.
X-Columnas o campos desde X hasta el final.
X-YColumnas o campos X e Y.

tr                                    Sintaxis            tr [-dsc] cadena1 cadena2
Se emplea como traductor. Como todo filtro tr lee datos de la entrada estándar, los procesa y deposita los resultados en la salida estándar. Busca los caracteres indicados por cadena1 y los sustituye por cadena2.

-dsirve para eliminar los caracteres indicados por cadena 1
-selimina caracteres repetidos indicados por cadena1
-cindica contrario, que no coincida con cadena1.

tee                                 Sintaxis            tee [-a] [archivo(s)]
Esta orden orden lee la entrada estándar por defecto y escribe su salida a la salida estándar y al archivo especificado. Si se utiliza la opción -a (append), tee  añade su salida al archivo en lugar de sobreescribirlo.

La orden find.

find                               Sintaxis            find camino expresión
La orden find es una de las más potentes de UNIX, pero también una de las que tienen una sintaxis más compleja. Esta orden se usa para examinar toda la estructura de directorios, o señalados en la línea de órdenes. Una vez localizados, podemos hacer que ejecute distintas acciones sobre ellos. El campo expresión sirve para indicar los criterios de selección de los archivos y la acción que queremos aplicarles al encontrarlos.

Ejemplo:
$ find / -name ifconfig                               (busca el archivo ifconfig dentro de la estructura de directorios)
La opción -name indica a find que únicamente se busquen los archivos cuyo nombre se especifica a continuación. Cuando find no puede buscar en un determinado directorio por no poseer derechos de acceso, no los comunica. Para evitar estos mensajes de error podemos redirigir el error a /dev/null.
Ejemplo:
$ find / -name login 2>/dev/null
Opciones:

-userle indicamos a find que seleccione los archivos que pertenezcan al usuario que se indica a continuación de -user.
-groupselecciona los archivos pertenecientes al grupo indicado a continuación.
-mtime narchivos modificados hace n días.
-mtime -narchivos modificados en los últimos n días.
-mtime +narchivos modificados hace más de n días.
-size -marchivos cuyo tamaño es menor de m bloques.
-size +marchivos cuyo tamaño es mayor de m bloques.
-type xarchivos del tipo indicado por x (d directorios, f archivos, l enlaces, etc.).
-inum narchivos cuyo inodo es n
-perm modearchivos cuyos permisos sean los dados por mode.
-exec ordenejecuta la orden usando como argumento los resultados de la búsqueda.

Todas estas opciones pueden ser negadas con el carácter ! seguido de un espacio en blanco.

Editor de flujo sed.

sed    Sintaxis  sed [-f f_ord] [-n] [archivo(s)]
La herramienta sed es un editor de flujo (stream editor) utilizado para manipular archivos de texto. sed copia los archivos indicados (por defecto, el archivo estándar de entrada) en la salida estándar después de procesarlos. Este procesamiento de los archivos de entrada se lleva a cabo línea por línea, acorde con las órdenes dadas a sed, estas órdenes pueden residir en un archivo, en cuyo caso usaremos la opción -f seguida del nombre del archivo que contiene las órdenes (f_ord). La opción -n se utiliza si queremos ver la línea que está siendo procesada.
Algunas órdenes de sed:
         sustituye  sed ‘s/procesar/manipular/g’ archivo        (aquí indicamos que queremos sustituir procesar por manipular a lo largo de todo   el archivo, lo indica g.)
d    borra sed ‘1,3d’ archivo   (elimina desde la línea 1 hasta la 3 del archivo)

y   traduce caracteres (los cambia por otros) sed ‘y/[aeiou]/[AEIOU]/’ archivo               (cambia las vocales en minúsculas por vocales en mayúsculas).