Comandos de gestión de procesos

Vamos ver los comandos con los que podemos ver el estado y atributos de los procesos y los comandos que nos permiten cambiar algunas características de los procesos.

Ejecución en background y comandos jobs, fg y bg

Cuando ejecutamos un comando en la consola esta se queda a la espera que termine el proceso que hemos ejecutado. Podemos hacer que comience la ejecución e inmediatamente nos devuelva el control a la consola. Para ello tenemos que utilizar el operador & al final del comando.

[pcm@sal]$ firefox &
[1] 23710
[pcm@sal]$ 

Si no hubiésemos puesto & hasta que no cerráramos la aplicación firefox no podríamos usar la consola. Podríamos ver que estamos ejecutando en esa consola en background con el comando jobs.

[pcm@sal]$ jobs
[1]+  Running                 firefox &
[pcm@sal]$ 

Incluso podemos llevar una aplicación que esta corriendo en background a la consola con el comando fg dándole el número que aparece con el comando jobs o cuando ejecutamos el comando en background. También podemos parar un proceso que esta en la consola pulsando Control+Z o utilizando desde otra consola el comando kill, y luego enviando el proceso a background con bg.

[pcm@sal]$fg 1
firefox

Si ahora queremos llevarle a background de nuevo pulsaríamos Control+Z.

[1]+  Stopped                 firefox
[pcm@sal]$ bg 1
[1]+ firefox &
[pcm@sal]$

Importante

Si un proceso en background utiliza la consola para interactuar con el usuario, el proceso se queda en estado parado.

Comando ps

Este comando nos permite ver los procesos que actualmente existen en el sistema. Es un comando con una amplia parametrización para que podamos ver cómodamente la información de procesos.

Este es el comando preparado para ver todas las características de los procesos. Al ser un comando estándar el todos los UNIX soporta un montón de parámetros especificados en versiones anteriores del ps.

Para listar todos los procesos de la máquina haríamos:

[root@sal]# ps -ef

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Apr07 ?        00:00:01 init [2]
root         2     1  0 Apr07 ?        00:00:02 [keventd]
root         3     1  0 Apr07 ?        00:00:00 [ksoftirqd_CPU0]
root         4     1  0 Apr07 ?        00:00:00 [ksoftirqd_CPU1]
root         5     1  0 Apr07 ?        00:00:03 [kswapd]
root         6     1  0 Apr07 ?        00:00:00 [bdflush]
root         7     1  0 Apr07 ?        00:00:03 [kupdated]
root       409     1  0 Apr07 ?        00:00:00 [knodemgrd_0]
root       541     1  0 Apr07 ?        00:00:00 [khubd]
daemon     865     1  0 Apr07 ?        00:00:00 /sbin/portmap
root       955     1  0 Apr07 ?        00:00:03 /sbin/syslogd
root       958     1  0 Apr07 ?        00:00:00 /sbin/klogd
pcm20     1026     1  0 Apr07 ?        00:00:00 /usr/sbin/famd -T 0
root      1032     1  0 Apr07 ?        00:00:00 /usr/sbin/inetd
root      1047     1  0 Apr07 ?        00:00:00 /usr/sbin/lisa
root      1150     1  0 Apr07 ?        00:00:01 /usr/sbin/nmbd -D
root      1152     1  0 Apr07 ?        00:00:00 /usr/sbin/smbd -D
root      1158  1152  0 Apr07 ?        00:00:00 /usr/sbin/smbd -D
root      1159     1  0 Apr07 ?        00:00:00 /usr/sbin/sshd
root      1168     1  0 Apr07 ?        00:00:00 /sbin/rpc.statd
root      1174     1  0 Apr07 ?        00:00:01 /usr/sbin/sensord -f daemon
daemon    1205     1  0 Apr07 ?        00:00:00 /usr/sbin/atd
root      1208     1  0 Apr07 ?        00:00:00 /usr/sbin/cron
root      1313     1  0 Apr07 ?        00:00:02 /usr/sbin/apache
root      1325     1  0 Apr07 ?        00:00:00 /usr/bin/hts -F localhost:22
root      1341     1  0 Apr07 ?        00:00:00 /usr/bin/kdm
root      1348     1  0 Apr07 tty1     00:00:00 /sbin/getty 38400 tty1
root      1349     1  0 Apr07 tty2     00:00:00 /sbin/getty 38400 tty2
root      1350     1  0 Apr07 tty3     00:00:00 /sbin/getty 38400 tty3
root      1351     1  0 Apr07 tty4     00:00:00 /sbin/getty 38400 tty4
root      1352     1  0 Apr07 tty5     00:00:00 /sbin/getty 38400 tty5
root      1353     1  0 Apr07 tty6     00:00:00 /sbin/getty 38400 tty6
root      1372  1341  0 Apr07 ?        00:14:53 /usr/X11R6/bin/X -nolisten tcp -
root      1411     1  0 Apr07 ?        00:00:02 /usr/bin/perl /usr/share/webmin/
root      1418  1341  0 Apr07 ?        00:00:00 -:0
[root@sal]# 

Es muy recomendable ver el manual de este comando.

Comando top y htop

Nos muestra información de los procesos que existen, y de algunos parámetros del sistema como la memoria, tiempo de ocupación de cpu, a intervalos, es decir, no termina una vez que los muestra si no que vuelve a ejecutarse en pequeño tiempo y vuelve a mostrar los nuevos datos.

[root@sal]# top 
top - 01:47:25 up 1 day,  3:38,  1 user,  load average: 0.01, 0.04, 0.03
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
Cpu(s):   5.6% user,   8.2% system,   0.0% nice,  86.1% idle
Mem:    516528k total,   503012k used,    13516k free,    44320k buffers
Swap:   337356k total,    13496k used,   323860k free,   165572k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 2078 pcm       19   0 14772  14m  12m S 10.6  2.8  11:37.18 kdeinit
 1372 root      12 -10 83448  73m 9228 S  3.5 14.5  14:55.90 XFree86
22682 root      19   0  1084 1084  844 R  3.2  0.2   0:00.30 top
 2086 pcm       10   0  101m  97m  23m S  1.3 19.4  21:51.38 netscape-bin
21199 pcm       12   0 30420  29m  13m S  1.3  5.9   0:10.50 java_vm
 2100 pcm       12   0  101m  97m  23m S  1.0 19.4   0:09.66 netscape-bin
 2075 pcm       11   0 18184  17m  13m S  0.6  3.5   0:21.67 kdeinit
 5012 pcm       11   0 10864  10m 4072 S  0.6  2.0   3:13.78 emacs
 8591 mysql     10   0 13600  13m 2932 S  0.6  2.6   0:48.99 mysqld
 1411 root      10   0  5744 3448 2088 S  0.3  0.7   0:02.43 miniserv.pl
 2068 pcm        9   0 12920  12m  10m S  0.3  2.4   1:35.65 kdeinit
 8153 root       9   0   944  904  796 S  0.3  0.2   0:09.22 dirmngr
 8592 mysql     10   0 13600  13m 2932 S  0.3  2.6   0:54.86 mysqld
21197 pcm        9   0 30420  29m  13m S  0.3  5.9   0:04.70 java_vm
    1 root       9   0   500  500  448 S  0.0  0.1   0:01.62 init
    2 root       9   0     0    0    0 S  0.0  0.0   0:02.30 keventd
  

El mismo comando pero visualmente más bonito y más sencillo de utilizar es htop. Aunque es probable que no lo encontremos instalado como base en muchos sistema Linux o Unix.

htop

Comando pstree

Nos da el árbol de procesos, es decir nos hace un árbol de los procesos mediante su PPID.

Comando nice y renice

Estos comandos nos permiten lanzar un proceso con una prioridad determinada el primero y el segundo cambiar la prioridad de un proceso.

Comando kill

Nos permite enviar una señal a un proceso. Por defecto envía la señal de parada al PID que pongamos, de ahí su nombre, pero realmente con un parámetro podemos enviar otros tipos de señales de procesos.

[root@sal]# kill 22670
[root@sal]# 

Para ver la lista de señales soportadas por el comando podemos hacer:

[root@sal]# 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      33) SIGRTMIN    34) SIGRTMIN+1
35) SIGRTMIN+2  36) SIGRTMIN+3  37) SIGRTMIN+4  38) SIGRTMIN+5
39) SIGRTMIN+6  40) SIGRTMIN+7  41) SIGRTMIN+8  42) SIGRTMIN+9
43) SIGRTMIN+10 44) SIGRTMIN+11 45) SIGRTMIN+12 46) SIGRTMIN+13
47) SIGRTMIN+14 48) SIGRTMIN+15 49) SIGRTMAX-15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
[root@sal]# 

Las señales más utilizadas son:

  • SIGKILL Termina el proceso, no puede ser ignorada. Se puede enviar con kill -s SIGKILL pid o kill -9 pid, que es modo estándar en otros UNIX.

  • SIGSTOP Para el proceso, no puede ser ignorada.

  • SIGTERM Se ordena al proceso que termine, el cual puede ser ignorar la señal. El la señal enviada por defecto.

Comando killall y pkill

Con estos comandos vamos a poder enviar señales a procesos, en vez de por PID, por el nombre, con killall y por otras propiedades de los procesos como pueden ser el usuario, el GID, el proceso padre, etc, con pkill. Por ejemplo:

[pcm@sal]# ps
 4548 pts/2    00:00:00 bash
 4565 pts/2    00:00:00 gconfd-2
22780 pts/2    00:00:34 xpdf.bin
22824 pts/2    00:00:00 ps

[pcm@sal]# killall xpdf.bin
[pcm@sal]# 

Con esta acción terminaría el proceso 22780.