Al momento que ejecutamos un programa, este pasa a llamarce proceso.
Los procesos son todos esos programas que ejecutamos, ya sea desde el servidor
X Windows, desde la línea de comandos o aquellos que se ejecutan al
momento de iniciar el sistema como los daemons. Aquellos procesos que se
inician en el arranque del sistema de la máquina son ejecutados por
root o nobody ( nadie ). Si somos usuarios y ejecutamos un programa ese programá
será corrido como proceso de nuestro usuario y así los programas
ejecutados por los demás usuarios seran procesos de los demás
usuarios.
Nosotros tenemos la particularidad de poder controlar los procesos de nosotros,
pero root tiene el control sobre todos los procesos en el sistema, ya sea
un proceso de él mismo o de algún otro usuario en el sistema.
Para el correcto funcionamiento del sistema estos procesos pueden ser controlados,
analizádos y supervisados gracias a varios programas tanto de X window,
como de consola o con simples comandos desde la shell.
Todos los programa que se ejecutan en primer plano desde la línea
de comandos, nos permiten ver el output del comando ejecutado, dejandonos
el terminal ocupado para poder ver y analizar todas esas salidas. Entonces,
¿que ocurre si nuestros terminales están copados con programas
que no podemos detener o estos están siendo usados por otros usuarios
del sistema ?, bueno, para esto existen varias opciones para dejar un proceso
ejecutandoce en background ( o segundo plano). Esto significa que el programa
en cuestión seguirá siendo ejecutado, pero sin ocuparnos el
terminal y además ya no verémos el output del programa para
así poder seguir trabajando en el terminal.
La forma más común de enviar un programa a segundo plano es
agregando un ampersans ( & ) al final del comando ejecutado. Por ejemplo,
suponiendo que deceamos ejecutar el programa mpg123 para escuchar musica
desde un terminal, pero deceamos seguir trabajando en ese terminal porque
los demás estan siendo ocupados con procesos de download como wget,
o de navegación con lynx u otros, entonces nosotros ejecutando le
programa así :
$ mpg123 /home/slack/musica/*.mp3 &
Esto hará que logremos nuestro objetivo de escuchar musica y dejar
libre el temrinal para algún otro uso. Aveces puede parecer que el
comando en cuestión esta siendo ejecutado en primer plano, pero si
presionamos <ENTER> nos devolverá al prompt dejando el programa
en background.
También existe otra forma de enviar un proceso a segundo plano. Esto
se hace mientras el programa está en ejecución. Por ejemplo
:
Aquí ejecutamos el programa mpg123 nuevamente :
$ mpg123 /home/slack/musica/*.mp3
Esto nos deja el programa mpg123 en primer plano. Ahora si presionas
Control+z nos arrojará algo como esto:
[1]+ Stopped
mpg123 /home/slack/musica/*.mp3
$
Lo que ocurre es que, el programa mpg123 está en un estado de pausa
dejandonos así devuelta en el prompt. Pero obviamente nosotros deceamos
seguir escuchando música, pero sin ocupar el terminal, asi que , tecleamos
en el terminal lo siguiente :
$ bg
[1]+ mpg123 /home/slack/musica/*.mp3 &
$
Como te darás cuenta el proceso en pausa ( osea mpg123 ) continuará
su funcionamiento, pero en background, dejandonos con el prompt libre.
Si llegaramos a querer interactuar ( osea ver el output ) de un programa
en ejecución que se encuentre en background y ejecutamos lo siguiente
:
$ fg
Lo que ocurre con el comando fg es que, nos deja ver el output de un programa
que se encontraba en background. Si el programa aún se encontrara
en ejecución nos darémos cuenta, ya que, el terminal será
practicamente tomado por el proceso y no podrémos ver el prompt.
Hay veces en las que un programa puede termnar su ejecución mientras
se encuentra en background, esto generará un mensaje. Por ejemplo,
anteriormente habíamos ejecutado mpg123, suponiendo que solo
escuchábamos una canción y esta a terminado nos saldrá
un mensaje como este:
[4:16] Decoding of Creed - Torn.mp3 finished.
Y si presionas <ENTER> nos saldrá esto:
[1]+ Done
/bin/ls $LS_OPTIONS
$
Lo cual nos indica que el proceso que se encontraba en background a terminado.
Todo lo anterior es visto con un solo proceso en ejecución, pero también
podemos tener varios en background al mismo tiempo. Cuando es así
nosotros deceamos saber que procesos es el que está en el fondo para
así poder traerlo de vuelta al primer plano. Para eso este propósito
la shell nos proporciona el comando jobs. Es comando sencillamente nos lista
los trabajos activos del terminal en el terminal. Una ejemplo de jobs sería
:
# jobs
[1] Running
mozilla -edit &
[2]- Running
mpg123 /home/slack/musica/Creed\ -\ Torn.mp3 &
[3]+ Stopped
vim
En este ejemplo nos muestra que tenemos 2 trabajos en ejecución (
Running ) y uno detenido ( Stopped ). El número que aparece entre
corchetes es el que identifica el proceso de fondo y si te fijas el último
proceso tiene un signo más (+), esto quiere decir que ése será
el proceso que pasará a primer plano al teclear fg. Por ejemplo :
$ fg
Aquí traemos al primer plano el proceso vim, pero si ejecutamos:
$ fg 2
Traerémos el proceso número dos al primer caso, que sería
"mpg123 /home/slack/musica/Creed\ -\ Torn.mp3 &" y así sucesivamente.
Como haz notado esto nos es de una gran ayuda cuando solo disponemos de un
solo terminal para trabajar, permitiendonos ejecutar diferentes procesos
e ir intercambiandolos a nuestro antojo.
Ya que tienes un conocimiento sobre como manejarte en los procesos
que ejecutas en tu terminal, es hora de que puedas ver realmente la gran cantidad
de procesos que están en ejecución en todo tu sistema , tomando
también los procesos de los demás usuarios para pdoer moderarlos
( como lo haría root ). Para esto es usado un comando llamado ps(1),
que nos muestra un reporte del estado de los procesos en el momento de su
ejecución. Para ver una salida de este comando simplemente teclamos
ps en el terminal, esto ( en mi caso ) nos generá una salida como
esta :
$ ps
PID TTY TIME
CMD
914 pts/3 00:00:00 bash
1806 pts/3 00:00:00 ps
El ejemplo nos muestra los procesos básicos del shell en esos instantes,
osea los que están siendo ejecutados en el momento de ejecutar ps
apenas hacemos login como usuarios. Pero en caso de que la cantidad
de procesos sea mayor las columnas PID, TTY, TIME y CMD serán mantenidas.
La columna PID es un número que se le asigna al procesos para que
sea identificado y este es único para cada procesos. En
los kernels 2.2.x, el identificador de procesos puede estar entre 1 y 32767
.
A cada proceso se le asigna el siguiente PID que se encuentre libro en esos
instantes. Cuando un proceso es terminado, ya sea matado, reiniciado o simplemente
cuando termina si ejecución, el PID que este proceso estaba usando
queda libre para que pueda ser usado por otro proceso que se vaya a iniciar.
Los
mas probable es que esto cambie con la próximas series de kernels
2.4 y con la introducción de los PID de 32-bit.
La columna TTY nos indica el terminal en el que está siendo ejecutado
ese proceso. Como es de suponer, el tty en los procesos listados por el comandos
ps son los mismo, ya que, este comando simple nos dá la información
de los procesos de ese terminal. Como a de notar, ambos procesos estan siendo
ejecutados en "pts/3" el cual es el tercer terminal en X que yo tengo ejecutandoce.
Si estuviéramos desde un terminal fuera de la X, entonces el TTY sería
algo así como tty[x], donde [x] vendría siendo el numero del
terminal ( en Slackware diponemos de 6 terminales más uno séptimo
y octavo donde se puede ejecutar el sistema X window ) .
La columna TIME nos indica el tiempo que el CPU ha estado ejecutando un procesos,
que no es lo mismo que el tiempo real que demora un procesos en ejecutarce.
Esto es porque Linux es un sistema operativo multitarea, tiene muchos procesos
ejecutandoce todo el tiempo y cada uno de estos ocupa una porción
de tiempo del procesador. Por ende la columna TIME mostrará mucho
menos tiempo en un proceso que el que realmente toma este
en ejecutarce. Esto tambiñen nos sirve para verificar
si algo está mal en un proceso, ya que, si un proceso muestra
varios minutos es porque probablemente algo anda mal.
Finalmente tenemos la columna CMD que nos muestra realmente el programa en
sí, indicandonos su nombre y nada más. Si necesitamos obtener
otro tipo de información, debemos usar una de las tantas opciones
de pc.
Ahora si lo que queremos es obtener una lista completa de los procesos que
se están ejecutando en el sistema, debemos usar un par de opciones.
Por ejemplo :
$ ps -ax
PID TTY STAT TIME COMMAND
1 ?
S 0:04 init
2 ?
SW 0:00 [keventd]
3 ?
SWN 0:00 [ksoftirqd_CPU0]
4 ?
SW 0:00 [kswapd]
5 ?
SW 0:00 [bdflush]
6 ?
SW 0:00 [kupdated]
8 ?
SW 0:00 [khubd]
9 ?
SW 0:00 [kreiserfsd]
22 ?
SW 0:00 [kjournald]
681 ?
S 0:00 /sbin/rpc.portmap
688 ?
S 0:00 /usr/sbin/syslogd
691 ?
S 0:00 /usr/sbin/klogd -c 3 -x
693 ?
S 0:00 /usr/sbin/inetd
696 ?
S 0:00 /usr/sbin/sshd
705 ?
S 0:00 lpd Waiting
709 ?
S 0:00 /usr/sbin/crond -l10
711 ?
S 0:00 /usr/sbin/atd -b 15 -l 1
714 ?
S 0:00 sendmail: accepting connections
717 ?
S 0:00 sendmail: Queue runner@00:25:00 for /var/spool/clientmqueue
723 ?
S 0:00 /usr/sbin/gpm -m /dev/mouse -t
[ corte de la salida del comando ps -ax]
Como este comando nos lista un output demaciado grande lo hemos cortado,
pero enrealidad este es mucho mayor. Los procesos que podemos apreciar, son
ejecutados en su mayoría durante el inicio del sistema, pero claro
está que esto variará dependiendo de las configuraciones que
cada usuario le haga a su máquina.
Como es de notar las opciones -ax nos han dado una mayor información
sobre los procesos que se encuentran junto con agregar un par de columnas
nuevas. Lo que usted se estará preguntando ahora es , ¿ que
significa ese signo "?" en la columna TTY ?, bueno este signo representa
a todos aquellos procesos iniciados en un terminal que ya no esta activo
y que por ende como este ya no se encuentra activo no se le peude asignar
un terminal en particular al proceso.
La nueva columna STAT nos dice el estado del procesos que se encuentra en
ejecución. Estos son definidos por letras como se aprecia en la siguiente
tabla:
Códigos del estado del procesos
D |
uninterruptible sleep (usually IO) |
R |
runnable (on run queue) |
S |
sleeping ( osea que se encuentra
dormido ) |
T |
traced or stopped ( representa un
procesos detenido ) |
W |
paging |
X |
dead ( representa un proceso muerto
) |
Z |
zombie ( esta representa un procesos
zombie). Este representa aquellos procesos cuyos procesos padres han muerto
dejando el proceso hijo atrás. Cuando esto ocurre no es una buena
señal. |
Hay veces en las que un programa colapsa y se produce un error, esto
implica que el programa afectado deje de funcionar o afecte el correcto funcionamiento
del sistema, ademas este es muchas aveces necesario para realizar una labor.
Es por esto que nosotros tenemos a nuestra disposición la opción
de matar o reiniciar un proceso gracias al comando kill. Este pequeño
gran programa sencillamente se encarga de matar un proceso o de reiniciarlo
si esque hemos efectuado algunos cambios en el sistema o en el programa en
sí.
La señal por default usada por el comando kill es TERM ( de terminar).
La forma de especificarlas junto al comando kill son tres: -9 , -SIGKILL
y -KILL, esto en el caso claro está de si deceamos matar un procesos.
Por ejemplo, para matar un proceso nosotros necesitamos saber su PID ( que
es el número que lo identifica entre todos los procesos que se ejecutan
en el sistema y que además es único ) lo que se logra gracias
al comando ps como se explicaba anteriormente o de algún otro comando
alternativo como top. Su poniendo que vamos a matar el proceso vim que tiene
el PID 345 el resto es simplemente teclear esto:
$ kill -9 345
o
$ kill -KILL 345
o
$ kill -SIGKILL 345
Cualquiera de estas formas es válida para matar el proceso 345. Obviamente
nosotros debemos ser dueños del procesos que estamos matando o reiniciando,
ya si cualquier usuario pudiera matar o reiniciar el proceso que se le antoje
significaría un gran error de seguridad, pero claro está que
root puede matar el procesos que decee sea suyo o no.
Nos encontramos con que también existe la posibilidad de matar un
proceso usando su nombre como referencia. Para esto usamos el comando killal(1)
que mata procesos a partir del nombre. Por ejemplo, si deceamos matar todos
los procesos ejecutados por el comando vim tecleamos :
$ killall vim
Ahora todos los procesos que fueron ejecutado a partir de vim se encuentran
muertos. Esto claro está si lo ubieramos hecho como un usuario normal,
pero si los hace root lo que ocurre es que, todos los procesos vim en el
sistema son matados, sin diferenciar usuarios.
También podríamos llegar a encontrarnos de que un procesos
no es terminado por el comando kill, entonces necesitamos usar la opción
-9 ( para matar el procesos) que causará la muerte del procesos de
una forma certera. Por ejemplo:
$ kill -9 <PID>
Para conseguir un listado de todos los tipos de señales disponibles
para el comando kill debemos teclear:
# kill -l
1) SIGHUP
2) SIGINT
3) SIGQUIT
4) SIGILL
5) SIGTRAP
6) SIGABRT 7) SIGBUS
8) SIGFPE
9) SIGKILL
10) SIGUSR1 11) SIGSEGV
12) SIGUSR2
13) SIGPIPE 14)
SIGALRM 15) SIGTERM
17) SIGCHLD
18) SIGCONT 19) SIGSTOP
20) SIGTSTP
21) SIGTTIN
22) SIGTTOU 23) SIGURG
24) SIGXCPU
25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF
28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS
32) SIGRTMIN 33)
SIGRTMIN+1
34) SIGRTMIN+2 35) SIGRTMIN+3 36) SIGRTMIN+4
37) SIGRTMIN+5
38) SIGRTMIN+6 39) SIGRTMIN+7 40) SIGRTMIN+8
41) SIGRTMIN+9
42) SIGRTMIN+10 43) SIGRTMIN+11 44) SIGRTMIN+12 45) SIGRTMIN+13
46) SIGRTMIN+14 47) SIGRTMIN+15 48) SIGRTMAX-15 49) SIGRTMAX-14
50) SIGRTMAX-13 51) SIGRTMAX-12 52) SIGRTMAX-11 53) SIGRTMAX-10
54) SIGRTMAX-9 55) SIGRTMAX-8 56) SIGRTMAX-7
57) SIGRTMAX-6
58) SIGRTMAX-5 59) SIGRTMAX-4 60) SIGRTMAX-3
61) SIGRTMAX-2
62) SIGRTMAX-1 63) SIGRTMAX
El número de la señal lo podemos usar con el comando kill,
pero con el comando killall es diferente, este lo debemos usar con el nombre
de la señal menos el prefijo "SIG". Por ejemplo:
$ killall -KILL xmms
Por último, pero no por eso menos importante podemos reiniciar un
procesos gracias a la señal "1) SIGHUP". Esta simplemente lo que hace
es tomar la configuración del programa en cuestión y a partir
de ahí ejecutarlo. Por ejemplo, en el caso de inetd(8), si realizamos
cambios en la configuración de /etc/inet.conf debemos reiniciar le
procesos de inetd para que los cambios sea aplicados en el sistema, suponeindo
que el PID de inetd sea 486 el comando sería.
El comando top nos permite ver la actividad de los procesos en el sistema
en tiempo real. Este muestra una lista de la mayoría de las tareas
intensivas del sistema, además nos provee de una interface interactiva
para manipular los procesos. A grandes razgos esta puede clasificar las tareas
usadas por la CPU ( que significa Unidad Central de Proceso ), la memoria
y el tiempo de ejecución. Este se ejecuta tecleando lo siguiente :
$ top
Más detalladamente top nos entrega el número total de procesos
que se encuentran en ejecución, duermiendo, detenidos y zombie. el
estado de la CPU, información sobre la RAM total del sistema, la usada,
la libre y la usada en los buffers y en el caso de la Swap el total, el usado,
el libre y el usado para caché. Además de toda esa información
referente al sistema nos da detalles de los procesos, tales como : el PID
del procesos , el USER( usuario) del procesos, el %CPU que es ocupada por
un procesos, el %MEM que ocupa un procesos y así.
Figura 11-1. Ejemplo del programa top
Este capítulo nos a explicado que es un procesos y como manupularlo
tanto para el correcto funcionamiento del sistema como para el beneficio
propio, lo que incluye backgounding y foregounding, así como el uso
de ps, kill y top. Ahora usted debe poder localizar los procesos que se están
ejecutando en el sistema y así, dependiendo de si su comportamiento
afecta o no al sistema o si se a agregado una nueva modificación a
sus archivos de configuración , reiniciarlos o eliminarlos.
Manejando Archivos y Directorios | Indice | Administración Esencial del Sistema |