sábado, 17 de enero de 2009

Inicio de múltiples procesos en Linux (Multitarea en Linux)

Se puede iniciar la ejecución de un programa simplemente escribiendo el nombre en la linea de comandos y luego pulsando enter. Ese programa deja una huella en el sistema mientras está en ejecución, linux le asigna un PID, para poder gestionarlo.

ps -A
PID TTY TIME CMD
1 ? 00:00:00 init
2 ? 00:00:00 kthreadd
3 ? 00:00:00 migration/0
4 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 watchdog/0
6 ? 00:00:00 migration/1


Un proceso es un programa en ejecución y es distinto a un programa. Un programa es un conjunto de instrucciones, mientras que un proceso es dinámico porque usa los recursos del sistema. También un programa puede ejecutar varios procesos.

Los siguientes comandos son de multiusuario y multitarea.

at --> Ejecuta un comando cuando lo necesites, es un tiempo determinado
bach --> Ejecuta el comando cuando puede el sistema
kill --> Mata procesos
nice --> Ajusta la prioridad de un proceso antes de que empiece
cron --> Ejecuta comandos de forma planificada
nohup --> Permite que un proceso que se esta ejecutando, siga cuando desconectes.
renice --> Ajusta la prioridad del proceso mientras se ejecuta
ps --> Informa sobre el proceso


Para ejecutar un programa en segundo plano basta con colocarle el signo '&' detrás del nombre o los argumentos si tuviera.

lp miarchvo.txt &
[1] 690

Así inmediatamente después de ejecutar el programa, linux informa del PID del proceso para mantenerse informado sobre él, poder finalizarlo, cambiarle la prioridad, etc.

Otra forma de iniciar múltiples procesos es usar conducciones, este comando ejecuta tres procesos independientes a la vez y se hace separando los comandos por la barra vertical '|'.

dd if=/dev/sda2 of=/dev/sdb2 | find -name *.txt | lp

Se puede planificar un comando usando el comando 'at', cuando llegue el momento se ejecutará.

at 1:45 (enter)
at> rm archivo.txt (enter)

at>
(ctrl-D)
job 1 at 2009-01-18 01:45

Las tareas con 'batch' hacen que la carga del sistema esté más repartida, el proceso se ejecuta cuando la carga del sistema no es demasiado alta, el sistema decide cuando. Ctrl-D representa el 'fin de archivo'.

batch (enter)
at> rm ProgramadePuntosDIC.pdf
(enter)
at>
(ctrl-D)
job 5 at 2009-01-18 01:55


Como es normal, cuando un proceso padre es terminado, los procesos hijos finalizan, pero 'nohup' permite ejecutar el proceso aunque salga de su sesión. El proceso durará lo que sea necesario hasta que se ejecute y para ir monitorizando como se comporta el proceso lo haremos con el log que genera 'nohup.out'

nohup sort archivo.txt &
[1] 9286
nohup: ignoring input and appending output to «nohup.out»


Para asignar una prioridad 'nice' o reasignar prioridad 'renice', la prioridad predeterminada es 10 hasta un máximo de 19 y un mínimo de -20. El siguiente comando aplicaría la máxima prioridad.

nice -n 19 sort texto.dat &


Estos comandos ejecutan programas en el momento en el que nosotros se lo decimos a través de la linea de comandos, pero si necesitamos que los procesos sean repetitivos utilizaremos 'cron' y 'crontab' no entraré en el uso de estos archivos de momento.

Por último debemos conocer 'kill', es útil para terminar un programa que usa demasiado tiempo de CPU, lleva demasiado tiempo y no produce una salida, bloquea un terminal, no es necesario, etc...

El programa 'ps -A' visualiza todos los procesos que se están ejecutando en ese momento, es útil para localizar ese proceso que ya no necesitamos, y después:

kill PID