4- Control de Procesos

  • Backgrounding
  • Foregrounding
  • ps
  • kill
  • top
  • Resumen


    Introducción

    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.


    Background

    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.


    Foreground

    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.


    ps

    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.


  • Si usted ecnuentra que la información aún no es tan detallada como usted querría, teclee el comando "ps -aux" el que nos mostrará una información bastante más detallada sobre los procesos mediante nuevas columnas. Ejemplo :


    $ ps -aux

    USER       PID %CPU %MEM   VSZ  RSS TTY      STAT  START   TIME COMMAND
    root             1        0.1       0.1      480    228    ?           S        00:27      0:04    init
    root             2        0.0       0.0        0      0        ?           SW     00:27     0:00    [keventd]
    root             3        0.0       0.0        0      0        ?           SWN  00:27     0:00    [ksoftirqd_CPU0]
    root             4        0.0       0.0        0      0        ?           SW     00:27     0:00    [kswapd]
    root             5        0.0       0.0        0      0        ?           SW     00:27     0:00    [bdflush]
    root             6        0.0       0.0        0      0        ?           SW     00:27     0:00    [kupdated]
    root             8        0.0       0.0        0      0        ?           SW     00:27     0:00    [khubd]
    root             9        0.0       0.0        0      0        ?           SW     00:27     0:00    [kreiserfsd]
    root           22        0.0       0.0        0      0        ?           SW     00:27     0:00    [kjournald]
    rpc          681        0.0       0.4     1504   560    ?           S        00:28      0:00    /sbin/rpc.portmap
    root         688        0.0       0.4     1424   612    ?           S        00:28      0:00    /usr/sbin/syslogd
    root         691        0.0       0.3     1360   460    ?           S        00:28      0:00    /usr/sbin/klogd -c 3 -x
    root         693        0.0       0.3     1356   424    ?           S        00:28      0:00    /usr/sbin/inetd
    root         696        0.0       0.9     3044   1136  ?           S        00:28      0:00    /usr/sbin/sshd
    lp             705        0.0       0.8     3348   1024  ?           S        00:29     0:00    lpd Waiting
    root         709        0.0       0.4     1480    584   ?           S        00:29      0:00    /usr/sbin/crond -l10
    daemon  711        0.0       0.5     1488    636   ?           S        00:29      0:00    /usr/sbin/atd -b 15 -l 1
              [ aquí cortamos la salida del comando ps -aux]

    Esta salida de "ps -aux" es lo que se podría denominar una información entera. En relación a los coamndos ps anteriormente aplicados este agrega información sobre el usuario que inició un procesos, cuantos recursos del sistema consume el proceso ( mostrado en las columnas %CPU, %MEM, VSZ y RSS ) y la fecha de inico del proceso. Como supongo notaste, el nombre del comando llega hasta el borde de la pantalla sin permitirnos verlo por completo en casos que fuera muy extenso, para arreglar esto simplemente agregamos la opción -w al comando anterior. Tal vez el output con la opción -w no se verá muu lindo que digamos, pero nos es de gran ayuda a la hora de la administración del sistema. Como me e encargado de mostrar las opciones más comunes de ps puede que decees ver con mayor detalle cada proceso, para esto puedes consultar la pagina del manual ps.

    kill

    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.


    top

    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

     

    Algo para notar es que se llama top, ya que, lista los programas de uso intensivo de la CPU en el tope Eso seguido de los procesos inactivos y otro activos debido a uso de la CPU. Sin embargo top es uno de los comandos más usados para verificar procesos en el sistema ya que, nos dice que programas están bien y que programas no lo están permitiendonos matar o reinicar un procesos para beneficio del sistema.

    Resumen

    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