En cada sesión Unix tres archivos predeterminados son abiertos: estándar de entrada, de salida y de error.
La entrada es el lugar desde donde un comando obtiene la información necesaria de entrada. Habitualmente, por omisión, ésta será el teclado.
La salida es el lugar a donde un comando envía el resultado de su ejecución, por omisión, este lugar será la pantalla).
Error es el lugar donde el sistema operativo envía cualquier mensaje de error que se produzca, por omisión, será la pantalla.
El proceso tal cual lo acabo de describir ahora es conocido habitualmente como entrada/salida estándar. No obstante, este comportamiento es susceptible
de ser modificado, según sean nuestras necesidades, gracias a cuatro tipos de redireccionamiento que emplea la shell:
< (signo menor que): Acepta la entrada de un archivo.
> (signo mayor que): Envía la salida estándar a un archivo.
>> (signo mayor que dos veces): Añade la salida estándar a un archivo.
| (barra vertical): Conecta la salida estándar de un comando con la entrada estándar de otro. Este redireccionamiento es también conocido como tubería o
pipe y es uno de los más usados en linux.
Un ejemplo de esto podría ser el siguiente:
ls -l >ListadoDir1.txt que enviará la lista del directorio al archivo ListadoDir1.txt .
Usando la redirección, la entrada estándar y/o salida estándar podrá ser referenciada desde ficheros con toda la capacidad y potencia que ello ofrece.
Deberá tenerse en cuenta, asimismo, que el uso de > (mayor que) para redireccionar la salida a un fichero que ya exista, es destructivo, es decir, la orden
del ejemplo de antes: ls -l >ListadoDir1.txt sobreescribirá el contenido del fichero ListadoDir1.txt . Si en su lugar, usamos el símbolo >> (doble signo
mayor que), la salida será añadida al final del fichero nombrado, en lugar de ser sobrescrito.
Uso de Tuberías (pipes)
El uso de tuberías (pipes) es la característica de la shell , que nos permite conectar una cadena de órdenes en una tubería, donde la salida estándar de
la primera es enviada directamente a la entrada estándar de la segunda y así sucesivamente. Si quisiéramos conectar la salida de la orden ls con la entrada
de la orden sort. Para crear un pipe se usa el símbolo |:
ls /usr | sort -r
Imaginemos que la salida de las órdenes entubuadas con anterioridad fuera muy grande, podríamos querer añadir a la tubería la orden more para poder examinar
los resultados con comodidad del siguiente modo:
ls /usr | sort -r | more
SERVICIOS
Los servicios, normalmente, en linux se sitúan en un directorio cuya ruta es: /etc/init.d y linux los carga al arrancar si están situados allí.
A los servicios se les llama en linux también demonios (daemons). por tanto, una aplicación de tipo daemon equivale a un servicio de tipo demonio. Todos
los scrips que se encuentran en init.d se consideran demonios (el concepto es similar al de servicio en Windows). Generalmente la mayor parte de estos
servicios son, en realidad, scripts de la shell que arrancan programas colocados en otros sitios dándoles losParámetros requeridos para su correcta ejecución.
Un claro ejemplo suele ser el script para arrancar el daemon BRLTTY que se encarga de leer la consola a través de la línea braille y que, Posiblemente
en futuras lecciones nos introduzcamos ligeramente en él. Si quieres ver los demonios cargados en tu sistema echa un vistazo a su directorio: /etc/init.d
PROCESOS
Un proceso es un programa en ejecución que queda bajo el control de la Shell. GNULinux es multitarea, por lo tanto, asigna intervalos de tiempo a las tareas
según un esquema de prioridades. Cuando la Shell ejecuta un programa se crea un proceso nuevo con un número entre el 1 y 30.000 (PID). Cuando existe Un
proceso que crea a otro se le denomina proceso padre y al creado proceso hijo. Este va a heredar casi la totalidad del entorno del padre (incluyendo las
variables…) pero sólo puede modificar el suyo y no el de su creador. Cada proceso posee también un número de grupo de procesos (PGID).
La orden para saber información sobre los procesos (aplicaciones en ejecución) que están en marcha en un momento determinado: es ps
ps (muestra el número de proceso PID, el terminal, el tiempo en ejecución, y el comando y se refiere a nuestra sesión).
ps -e: muestra información extendida de todos los procesos lanzados en todos los terminales (gráficos y de texto). El tipo de salida por pantalla tendrá
el mismo formato que el anterior.
ps -f Además muestra el PPID proceso padre, uso del procesador y tiempo de comienzo.
ps -j Muestra el PGID.
Normalmente, un proceso padre espera a que finalice uno hijo, devolviéndole el hijo un valor para informarle sobre cómo ha ido la ejecución (si valor=0
-finalizó sin errores; si valor distinto 0 -algo ocurrió). Asimismo, Si un proceso se lanza varias veces, la primera se considera proceso padre y el resto
procesos hijos. La tarea que haría el proceso padre se reparte entre todos los procesos hijos. Si un proceso hijo muere o es matado, es decir, se apaga,
no ocurre ningún problema pero si se para el proceso padre, afectará a todos los procesos hijos
La salida de la orden ps aparece reflejada en columnas con lo siguientes datos:
uid: usuario que lanza el proceso
pid: identificador de procesos. Valor numérico que genera el sistema de forma automática.
ppid: identificador del proceso padre.
stime: la hora en que el proceso fue iniciado.
tty: indica el terminal desde el que se ha lanzado la aplicación. La interrogación se refiere a procesos que no estan
name: nombre de la aplicación que se ha lanzado.
Para ver sólo la línea referente al proceso sobre el que se quiere información se puede utilizar una tubería a la orden grep. Esta órden nos permite especificar
una cadena de caracteres a localizar. Por ejemplo: Para buscar los procesos relacionados con el programa BRLTTY que maneja a la línea braille, el comando
se podría introducir del siguiente modo:
ps -ef | grep BRL lo cual solamente tratará de localizar procesos que contengan la cadena BRL en su nombre.
La orden para detener Un proceso es kill. A esto, habitualmente se le llama matar un proceso y suele hacerse cuando una aplicación se cuelga. Incluso podremos
matar una consola entera desde otra cuando el cuelgue es tal que no nos permite hacer nada en ésa.
Su sintaxis es la siguiente:
kill númeroproceso
Hay que comprobar previamente el número del proceso (PID) con la orden ps tal como lo hemos hecho más arriba. Luego se utilizará el comando kill seguido
de un espacio y el número del proceso que queramos matar. Si, por ejemplo, tuviéramos un terminal bloqueando el sistema, podríamos «matarlo» averiguando
el número del proceso para el terminal: /etc/init.d
ps -ef|grep tty3
Si la respuesta que sale por pantalla fuera:
nombreterminal 2429 1 0 07:37 tty3 00:00:00 -sh
Escribiríamos la orden kill utilizando el número como parámetro: /etc/init.d del modo que sigue:
kill -3 2429
Para matar procesos que están en modo gráfico usaremos la orden xkill
Un proceso que esta corriendo, para el shell, se denomina tarea. Los términos proceso y tarea, son intercambiables. Sin embargo, se suele denominar «tarea»
a un proceso, cuando es usado con el control de tareas, que es una característica del shell que permite cambiar entre las diferentes tareas que puedan
estar corriendo simultáneamente.
En la mayor parte de las ocasiones, como creo haber comentado ya, solamente se suele correr un programa a la vez y, al menos a mí, me resulta más sencillo
abrir un par de terminales y ejecutar un programa por terminal, . Sin embargo, si utilizamos el control de tareas, podremos ejecutar diferentes tareas
a la vez y podremos, asimismo, ir cambiando de una a otra según lo vayamos necesitando.
Pasar tareas a primer Plano y Segundo Plano:
Cada programa que esté corriendo en la shell puede estar trabajando en dos modalidades: o en Primer plano o en Segundo plano. Solo puede haber un proceso
en primer plano al mismo tiempo, pero puede haber tantos en segundo plano como queramos o como la memoria y/o la capacidad del microprocesador nos permita.
el proceso que esté en primer plano, es el que va a interactuar con el usuario, recibiendo la entrada standard, o no, y enviando los resultados de salida,
generalmente a la pantalla caso de que no se haya redirigido la salida.
Los procesos en segundo plano, habitualmente, no van a recibir ninguna señal desde el teclado, es por ello, que se ejecutan en silencio sin necesidad de
interacción.
Todos los procesos pueden ser suspendidos, no se confunda esto con matarlos: Un proceso suspendido es aquel que no se está ejecutando actualmente, sino
que esta temporalmente parado, mientras que se dice que un proceso está muerto, generalmente cuando se pulsa la combinación de teclas Control+c, cuando
es detenido totalmente y eliminado de la memoria de trabajo liberando los recursos del sistema que en ese momento estaba consumiendo. Tras haber suspendido
una tarea, puede indicársele que continúe ejecutándose, tanto en primer plano como en segundo, según sea nuestra necesidad. Reanudar una tarea que haya
sido suspendida no cambia en nada su estado, la tarea proseguirá con su ejecución justo en el preciso lugar en el que había sido detenida.
Si se mata o elimina un proceso, éste no puede continuar ejecutándose, y deberá ser lanzado otra vez para volver a realizar sus tareas. También se puede
dar el caso de que algunos programas estén capturando la interrupción, de modo que pulsando Control+C no conseguimos que se detengan instantáneamente.
Esto ocurre debido a que de este modo se permite al programa realizar operaciones necesarias de limpieza antes de terminar.
De hecho, algunos programas simplemente no se dejan matar por ninguna interrupción.
Envío de tareas a Segundo Plano:
Una forma de mandar procesos a segundo plano es añadiendo un carácter & al final de cada comando.
yes > /dev/null &
Como respuesta, el sistemma nos enviará por pantalla el número del proceso que envió a segundo plano seguido de su pid. Para chequear el estado del proceso,
usaremos la orden interna de la shell jobs:
jobs
[1]+ Running yes >/dev/null &
Esto nos indica que tenemos al proceso 1 corriendo en segundo plano enviando el proceso yes al dispositivo null.
Tenemos una segunda forma de poner una tarea en segundo plano. Lo lanzaremos como un proceso normal, es decir, en primer plano, lo detenemos, y después
lo volvemos a lanzar en segundo plano. Esto es: lanzamos el proceso yes en primer plano con cualquier aplicación en modo normal,
yes > /dev/null
Debido a que yes está corriendo en primer plano, no nos debería mostrar el indicativo de la shell. Seguidamente,en lugar de interrumpir la tarea con Control+C,
suspenderemos la tarea con su combinación de teclas que, habitualmente, suele ser Control+Z. El sistema nos debería dar un mensaje del estilo de : [1]+
Stopped yes >/dev/null ocurrido esto, podemos relanzarla de nuevo en el lugar donde se detuvo pulsando otra vez la combinación Control+z. Si queremos que
la tarea se relance en primer plano, utilizaremos la orden fg tras lo que la shell volverá a mostrarnos el nombre del comando de nuevo, para mostrarnos
el nombre de la tarea que se ha puesto en primer plano. Si en su lugar tecleásemos la orden bg pondríamos la tarea en segundo plano. Esto hará que el comando
siga ejecutándose igual que si lo hubiese hecho desde el principio con & como en la primera manera en que lo hicimos.
Cuando tenemos una tarea en segundo plano deberemos tener en cuenta que si intentamos pararla pulsando Control+Z no funcionará, La solución es poner el
proceso en primer plano de nuevo, con la corden fg, y entonces pararlo.
Si no te interesa ver la salida de cualquier tarea que, estando en segundo plano muestre texto en pantalla, no te olvides de redirigir su salida estándar
hacia eldispositivo /dev/null. Asimismo aclarar que, normalmente, los comandos fg y bg actúan sobre el ultimo proceso parado (indicado por un + (signo
más) junto al numero de tarea cuando utilizamos la orden jobs). Si tenemos varios procesos corriendo a la vez, podremos enviar a primer o segundo plano
una tarea específica indicando el ID de tarea como argumento de fg o bg.
bg %3
para la tarea de segundo plano numero 3. No se pueden usar los ID de proceso con fg o bg. Además de esto, si usas el numero de tarea por si solo, como en:
%2
Es equivalente a:
fg %2