Administración de procesos en GNU/Linux fácil.

Administración de procesos en GNU/Linux fácil.

Administración de procesos en GNU/Linux fácil.

tareas


La más simple definición de un proceso podría ser que es una instancia de un programa en ejecución (corriendo). A los procesos frecuentemente se les refiere como tareas. El contexto de un programa que esta en ejecución es lo que se llama un proceso. Este contexto puede ser mas procesos hijos que se hayan generado del principal (proceso padre), los recursos del sistema que este consumiendo, sus atributos de seguridad (tales como su propietario y permisos de archivos asi como roles y demás de SELinux), etc.

administracion


Linux, como se sabe, es un sistema operativo multitarea y multiusuario. Esto quiere decir que múltiples procesos pueden operar simultáneamente sin interferirse unos con los otros. Cada proceso tiene la “ilusión” que es el único proceso en el sistema y que tiene acceso exclusivo a todos los servicios del sistema operativo.

Programas y procesos son entidades distintas. En un sistema operativo multitarea, múltiples instancias de un programa pueden ejecutarse sumultáneamente. Cada instancia es un proceso separado. Por ejemplo, si cinco usuarios desde equipos diferentes, ejecutan el mismo programa al mismo tiempo, habría cinco instancias del mismo programa, es decir, cinco procesos distintos.

Cada proceso que se inicia es referenciado con un número de identificación único conocido como Process ID PID, que es siempre un entero positivo. Prácticamente todo lo que se está ejecutando en el sistema en cualquier momento es un proceso, incluyendo el shell, el ambiente gráfico que puede tener múltiples procesos, etc. La excepción a lo anterior es el kernel en si, el cual es un conjunto de rutinas que residen en memoria y a los cuales los procesos a través de llamadas al sistema pueden tener acceso.

GNU


ps


El comando ps es el que permite informar sobre el estado de los procesos. ps esta basado en el sistema de archivos /proc, es decir, lee directamente la información de los archivos que se encuentran en este directorio. Tiene una gran cantidad de opciones, incluso estas opciones varían dependiendo del estilo en que se use el comando. Estas variaciones sobre el uso de ps son las siguientes:

Estilo UNIX, donde las opciones van precedidas por un guión -
Estilo BSD, donde las opciones no llevan guión
Estilo GNU, donde se utilizan nombres de opciones largas y van precedidas por doble guión –


Sea cual sea el estilo utilizado, dependiendo de las opciones indicadas, varias columnas se mostrarán en el listado de procesos que resulte, estas columnas pueden ser entre muchas otras, las siguientes (y principales):

p o PID - Process ID, número único o de identificación del proceso.

P o PPID - Parent Process ID, padre del proceso

U o UID User ID - Usuario propietario del proceso

t o TT o TTY - Terminal asociada al proceso, si no hay terminal aparece entonces un ‘?’

T o TIME - Tiempo de uso de cpu acumulado por el proceso

c o CMD - El nombre del programa o comando que inició el proceso

RSS o Resident Size - Tamaño de la parte residente en memoria en kilobytes

SZ o SIZE - Tamaño virtual de la imagen del proceso

NI o Nice - Valor nice (prioridad) del proceso, un número positivo significa menos tiempo de procesador y negativo más tiempo (-19 a 19)

C o PCPU - Porcentaje de cpu utilizado por el proceso

STIME - Starting Time, hora de inicio del proceso

S o STAT - Status del proceso, estos pueden ser los siguientes

R runnable, en ejecución, corriendo o ejecutándose
S sleeping, proceso en ejecución pero sin actividad por el momento, o esperando por algún evento para continuar
T sTopped, proceso detenido totalmente, pero puede ser reiniciado
Z zombie, difunto, proceso que por alguna razón no terminó de manera correcta, no debe haber procesos zombies
D uninterruptible sleep, son procesos generalmente asociados a acciones de IO del sistema
X dead, muerto, proceso terminado pero que sigue apareciendo, igual que los Z no deberían verse nunca


Las opciones completas de ps las encuentras en las páginas del manual (man ps), o escribiendo en la terminal ps L, y para ver un resumen de sus opciones más comunes usa ps –help:[/quote]

Code:
[vampird@sharwyn]:~$ ps --help
********* simple selection ********* ********* selection by list *********
-A all processes -C by command name
-N negate selection -G by real group ID (supports names)
-a all w/ tty except session leaders -U by real user ID (supports names)
-d all except session leaders -g by session OR by effective group name
-e all processes -p by process ID
T all processes on this terminal -s processes in the sessions given
a all w/ tty, including other users -t by tty
g OBSOLETE -- DO NOT USE -u by effective user ID (supports names)
r only running processes U processes for specified users
x processes w/o controlling ttys t by tty
*********** output format ********** *********** long options ***********
-o,o user-defined -f full --Group --User --pid --cols --ppid
-j,j job control s signal --group --user --sid --rows --info
-O,O preloaded -o v virtual memory --cumulative --format --deselect
-l,l long u user-oriented --sort --tty --forest --version
-F extra full X registers --heading --no-heading --context
********* misc options *********
-V,V show version L list format codes f ASCII art forest
-m,m,-L,-T,H threads S children in sum -y change -l format
-M,Z security data c true command name -c scheduling class
-w,w wide output n numeric WCHAN,UID -H process hierarchy
[vampird@sharwyn]:~$


A continuación algunos cuantos ejemplos de ps con la salida recortada.

Code:
[vampird@sharwyn]:~$ ps -e (-e muestra todos los procesos)
PID TTY TIME CMD
1 ? 00:00:01 init
2 ? 00:00:00 kthreadd
3 ? 00:00:00 migration/0
4 ? 00:00:00 ksoftirqd/0


Code:
[vampird@sharwyn]:~$ ps -ef (-f muestra opciones completas)
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 10:12 ? 00:00:01 init
root 2 0 0 10:12 ? 00:00:00 [kthreadd]
...
root 6130 5662 0 10:24 pts/0 00:00:00 su -
root 6134 6130 0 10:24 pts/0 00:00:00 -bash
vampird 6343 5604 0 10:28 ? 00:00:00 kio_file [kdeinit] file /home/vampird/tmp/ksocket-vampird/kl
vampird 6475 6134 0 10:38 pts/0 00:00:00 ps -ef


Code:
[vampird@sharwyn]:~$ ps -eF (-F muestra opciones completas extra)
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 1 0 0 412 556 1 16:59 ? 00:00:01 init
root 2 0 0 0 0 1 16:59 ? 00:00:00 [kthreadd]
vampird 8326 8321 0 902 1272 0 17:07 ? 00:00:00 /bin/sh /usr/lib/firefox-2.0.0.8/run-mozilla.sh /usr/lib/f
vampird 8331 8326 4 53856 62604 0 17:07 ? 00:00:50 /usr/lib/firefox-2.0.0.8/mozilla-firefox-bin
vampird 8570 7726 2 15211 37948 0 17:17 ? 00:00:10 quanta


Code:
[vampird@sharwyn]:~$ ps ax (formato BSD sin guión, a muestra todos, x sin mostrar tty)
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 init
2 ? S< 0:00 [kthreadd]
3 ? S< 0:00 [migration/0]
4 ? S< 0:00 [ksoftirqd/0]


Code:
[vampird@sharwyn]:~$ ps aux (formato BSD sin guión, u muestra usuarios y demás columnas)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1648 556 ? Ss 16:59 0:01 init
root 2 0.0 0.0 0 0 ? S< 16:59 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S< 16:59 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S< 16:59 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 16:59 0:00 [migration/1]


Code:
[vampird@sharwyn]:~$ ps -eo user,pid,tty (-o output personalizado, se indican los campos separados por coma, ver ps --help o ps L)
USER PID TT
root 1 ?
root 2 ?
vampird 8570 tty 1
root 8876 pts/1


Code:
[vampird@sharwyn]:~$ ps -eH (muestra árbol de procesos)
[vampird@sharwyn]:~$ ps axf (lo mismo en formato BSD)
[vampird@sharwyn]:~$ ps -ec (el comando que se esta ejecutando, sin la ruta, solo el nombre real)
[vampird@sharwyn]:~$ ps -el (muestra formato largo de varias columnas, muy práctico)
[vampird@sharwyn]:~$ ps L (No muestra procesos, lista todos los códigos de formatos)


procesos


pstree


Muestra los procesos en forma de árbol, pstree –help te da las opciones más comunes. Recomiendo uses lo uses con la opción -A y -G para que te un árbol con líneas con líneas estilo ASCII y de terminal VT100 respectivamente, puedes añadir también -u para mostrar entre paréntesis al usuario propietario del proceso:

Code:
[vampird@sharwyn]:~$ pstree -AGu
init─┬─NetworkManager─┬─dhclient
│ └─{NetworkManager}
├─VBoxSVC(vampird)─┬─VirtualBox───22*[{VirtualBox}]
│ └─9*[{VBoxSVC}]
├─VBoxXPCOMIPCD(vampird)
├─acpid
├─amarok(vampird)───13*[{amarok}]
├─auditd───{auditd}
├─avahi-daemon(avahi)
├─blogilo(vampird)
├─console-kit-dae───63*[{console-kit-dae}]
├─cron
├─cupsd
├─dbus-daemon
├─dbus-daemon(messagebus)
├─dbus-daemon(vampird)
├─dbus-launch
├─dbus-launch(vampird)
├─dolphin(vampird)
├─gconfd-2(vampird)
├─hald(haldaemon)─┬─hald-runner(root)─┬─hald-addon-acpi(haldaemon)
│ │ ├─hald-addon-cpuf
│ │ ├─hald-addon-gene
│ │ ├─hald-addon-inpu
│ │ ├─hald-addon-leds
│ │ ├─hald-addon-rfki
│ │ └─hald-addon-stor
│ └─{hald}
├─hddtemp
├─irqbalance
├─kaccess(vampird)
├─kded4(vampird)
├─kdeinit4(vampird)─┬─kio_file
│ ├─klauncher
│ ├─ksmserver─┬─kwin
│ │ └─{ksmserver}
│ └─seamonkey───seamonkey-bin─┬─npviewer.bin───2*[{npviewer.bin}]
│ └─13*[{seamonkey-bin}]
├─kdm─┬─Xorg
│ └─kdm───startkde(vampird)─┬─gpg-agent
│ ├─kwrapper4
│ └─ssh-agent
├─kglobalaccel(vampird)
├─kgpg(vampird)───{kgpg}
├─klipper(vampird)
├─kmix(vampird)
├─knetworkmanager(vampird)
├─knotify4(vampird)───4*[{knotify4}]
├─kopete(vampird)───2*[{kopete}]
├─krunner(vampird)
├─kwalletd(vampird)
├─kwalletmanager(vampird)
├─master─┬─pickup(postfix)
│ └─qmgr(postfix)
├─mcelog
├─6*[mingetty]
├─modem-manager
├─nepomukserver(vampird)
├─nscd
├─ntpd(ntp)
├─plasma-desktop(vampird)
├─polkit-kde-auth(vampird)
├─polkitd
├─rpcbind
├─rsyslogd───4*[{rsyslogd}]
├─smartd
├─start_kdeinit
├─udevd───2*[udevd]
├─udisks-daemon─┬─udisks-daemon
│ └─{udisks-daemon}
├─wpa_supplicant
└─yakuake(vampird)─┬─bash───pstree
└─{yakuake}
[vampird@sharwyn]:~$


Linux


kill


El comando kill, que literalmente quiere decir matar, sirve no solo para matar o terminar procesos sino principalmente para enviar señales (signals) a los procesos. La señal por default (cuando no se indica ninguna es terminar o matar el proceso), y la sintaxis es kill PID, siendo PID el número de ID del proceso. Asi por ejemplo, es posible enviar una señal de STOP al proceso y se detendrá su ejecución, después cuando se quiera mandar una señal de CONTinuar y el proceso continuara desde donde se quedo.

Code:
[vampird@sharwyn]:~$ kill -l (lista todas las posibles señales que pueden enviarse a un proceso)
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 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 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+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


La lista previa presenta una lista de todas las posibles señales que pueden mandarse a un proceso y estas pueden ser invocadas a través del número de la señal o de su código, por ejemplo:

Code:
[vampird@sharwyn]:~$ kill -9 11428 (termina, mata un proceso completamente)
[vampird@sharwyn]:~$ kill -SIGKILL 11428 (Lo mismo que lo anterior)


Las señales más comunes son la 19 y 20 que detienen momentáneamente la ejecución de un proceso o programa, 18 la continua, 1 que es la señal de hang up que obliga al proceso a releer sus archivos de configuración estando en ejecución y 9 que termina rotundamente un proceso.

htop


killall


El comando killall, que funciona de manera similar a kill, pero con la diferencia de en vez de indicar un PID se indica el nombre del programa, lo que afectará a todos los procesos que tengan ese nombre. Asi por ejemplo si se tienen varias instancias ejecutándose del proxy server squid, con killall squid eliminará todos los procesos que se esten ejecutando con el nombre ‘squid’

Code:
[vampird@sharwyn]:~$ killall -l (lista de posibles señales)
[vampird@sharwyn]:~$ killall -HUP httpd (manda una señal de "colgar", detenerse releer sus archivos de configuración y reiniciar)
[vampird@sharwyn]:~$ killall -KILL -i squid (manda señal de matar a todos los procesos squid pero pide confirmación en cada uno)


Administración de procesos en GNU/Linux fácil.


tareas


administracion


nice


Permite cambiar la prioridad de un proceso. Por defecto, todos los procesos tienen una prioridad igual ante el CPU que es de 0. Con nice es posible iniciar un programa (proceso) con la prioridad modificada, más alta o más baja según se requiera. Las prioridades van de -20 (la más alta) a 19 la más baja. Solo root o el superusuario puede establecer prioridades negativas que son más altas. Con la opción -l de ps es posible observar la columna NI que muestra este valor.

Code:
[vampird@sharwyn]:~$ nice (sin argumentos, devuelve la prioridad por defecto )
0
[vampird@sharwyn]:~$ nice -n -5 comando (inicia comando con una prioridad de -5, lo que le da más tiempo de cpu)


GNU


renice


Asi como nice establece la prioridad de un proceso cuando se incia su ejecución, renice permite alterarla en tiempo real, sin necesidad de detener el proceso.

Code:
[vampird@sharwyn]:~$ nice -n -5 yes (se ejecuta el programa 'yes' con prioridad -5)
(dejar ejecutando ‘yes’ y en otra terminal se analiza con ‘ps’)


Code:
[vampird@sharwyn]:~$ ps -el
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 1000 12826 12208 4 75 -5 - 708 write_ pts/2 00:00:00 yes
[vampird@sharwyn]:~$ renice 7 12826
12826: prioridad antigua -5, nueva prioridad 7
[vampird@sharwyn]:~$ ps -el
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 1000 12826 12208 4 87 7 - 708 write_ pts/2 00:00:15 yes


(obsérvese el campo NI en el primer caso en -5, y en el segundo con renice quedó en 7, en tiempo real)

procesos


nohup y &


Cuando se trata ejecutar procesos en background (segundo plano) se utiliza el comando nohup o el operador &. Aunque realizan una función similar, no son lo mismo.

Si se desea liberar la terminal de un programa que se espera durará un tiempo considerable ejecutándose, entonces se usa . Esto funciona mejor cuando el resultado del proceso no es necesario mandarlo a la salida estándar (stdin), como por ejemplo cuando se ejecuta un respaldo o se abre un programa Xwindow desde la consola o terminal. Para lograr esto basta con escribir el comando en cuestión y agregar al final el símbolo & (ampersand).

Code:
[vampird@sharwyn]:~$ yes > /dev/null &
[vampird@sharwyn]:~$ tar czf respaldo /documentos/* > /dev/null/ &
[vampird@sharwyn]:~$ konqueror & (con estos ejemplos se ejecuta el comando y se libera la terminal regresando el prompt)


Sin embargo lo anterior produce que el padre del proceso PPID que se invocó con sea el proceso de la terminal en si, por lo que si cerramos la terminal o salimos de la sesión también se terminaran los procesos hijos que dependan de la terminal, no muy conveniente si se desea que el proceso continué en ejecución.

Para solucionar lo anterior, entonces se usa el comando nohup que permite al igual que ‘&’ mandar el proceso y background y que este quede inmune a los hangups (de ahí su nombre nohup) que es cuando se cuelga o termina la terminal o consola de la cual se ejecutó el proceso.

Code:
[vampird@sharwyn]:~$ nohup yes > /dev/null &
[vampird@sharwyn]:~$ nohup czf respaldo /documentos/* > /dev/null/
[vampird@sharwyn]:~$ nohup konqueror


Asi se evita que el proceso se “cuelgue” al cerrar la consola.

Linux


jobs


Si por ejemplo, se tiene acceso a una única consola o terminal, y se tienen que ejecutar varios comandos que se ejecutarán por largo tiempo, se pueden entonces como ya se vió previamente con nohup y el operador ‘&’ mandarlos a segundo plano o background con el objeto de liberar la terminal y continuar trabajando.

Pero si solo se está en una terminal esto puede ser difícil de controlar, y para eos tenemos el comando jobs que lista los procesos actuales en ejecución:

Code:
[vampird@sharwyn]:~$ yes > /dev/null &
26837
[vampird@sharwyn]:~$ ls -laR > archivos.txt &
26854
[vampird@sharwyn]:~$ jobs
- Running yes >/dev/null &
+ Running ls --color=tty -laR / >archivos.txt &


En el ejemplo previo, se ejecutó el comando yes y se envió a background (& y el sistema devolvió 26837, indicando asi que se trata del trabajo o de la tarea y su PID, lo mismo con la segunda tarea que es un listado recursivo desde la raíz y enviado a un archivo, esta es la segunda tarea.

Con los comandos fg (foreground) y bg background es posible manipular procesos que esten suspendidos temporalmente, ya sea porque se les envió una señal de suspensión como STOP (20) o porque al estarlos ejecutando se presionó ctrl-Z. Entonces para reanudar su ejecución en primer plano usaríamos fg:

Code:
[vampird@sharwyn]:~$ jobs
- Stopped yes >/dev/null &
+ Stopped ls --color=tty -laR / >archivos.txt &
[vampird@sharwyn]:~$ fg %1
[vampird@sharwyn]:~$ jobs
+ Running yes >/dev/null &
- Stopped ls --color=tty -laR / >archivos.txt &


Obsérvese como al traer en primer plano al ‘job’ o proceso 1, este adquirió el símbolo [+] que indica que esta al frente. Lo mismo sería con bg que volvería a reinicar el proceso pero en segundo plano. Y también es posible matar los procesos con kill indicando el número que devuelve jobs: kill %1, terminaría con el proceso en jobs número 1.

htop


top


Una utilería muy usada y muy útil para el monitoreo en tiempo real del estado de los procesos y de otras variantes del sistema es el programa llamado top, se ejecuta desde la línea de comandos, es interactivo y por defecto se actualiza cada 3 segundos.

Code:
[vampird@sharwyn]:~$ top
top - 14:32:08 up 1:33, 3 users, load average: 0.11, 0.21, 0.32
Tasks: 155 total, 1 running, 154 sleeping, 0 stopped, 0 zombie
Cpu(s): 12.5%us, 16.3%sy, 0.1%ni, 65.3%id, 5.6%wa, 0.1%hi, 0.1%si, 0.0%st
Mem: 2046536k total, 2005336k used, 41200k free, 14036k buffers
Swap: 4200992k total, 18500k used, 4182492k free, 756940k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6411 vampird 20 0 1056m 625m 558m S 14 31.3 22:10.63 VirtualBox
2446 vampird 20 0 618m 76m 23m S 6 3.8 0:52.51 kopete
1717 root 20 0 306m 125m 43m S 4 6.3 17:21.27 Xorg
855 root 20 0 0 0 0 S 2 0.0 0:05.23 phy0
2386 root 20 0 46688 756 408 S 2 0.0 0:01.18 udisks-daemon
2413 vampird 20 0 493m 28m 14m S 2 1.4 3:41.65 kwin
6191 vampird 20 0 78084 15m 6792 S 2 0.8 1:24.07 npviewer.bin
7080 vampird 20 0 8668 1108 768 R 2 0.1 0:00.01 top
1 root 20 0 12408 552 512 S 0 0.0 0:00.61 init
2 root 20 0 0 0 0 S 0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0 0.0 0:00.00 migration/0
4 root 20 0 0 0 0 S 0 0.0 0:00.52 ksoftirqd/0
[vampird@sharwyn]:~$


Estando dentro de la aplicación, presionando ‘h’ muestra una ayuda de los posibles comandos que permiten configurar top, por ejemplo, al presionar ‘s’ pregunta por el tiempo en segundos de actualización, etc.

COMENTARIOS DE DESUBICADOS SERÁN ELIMINADOS. SALUDOS

Administración de procesos en GNU/Linux fácil.


22 comentarios - Administración de procesos en GNU/Linux fácil.

@Dyr26
Muy bueno! A favoritos para leerlo luego
@cyrg2005
Me gusto. Muy buen post! +5
@potasa
Muy buen laburo.
Lista de beneficencia segun potasa: A saber son
a) +10 por el post
b) A fav. para ser leido
c) 2 dioses del asado
tareas
administracion

d)1 gato con torticolis
GNU

y por ultimo
e) un Detective How
procesos
@potasa
No, no esta el jefe. Mi laburo es bastante automatizable.
@pucho27
te dejo 10 jjjee
@cruznick07
exelente info los puntos te los debo ya los di nada mas un detalle con la etiqueta
[code]code

[/code] se solucionan los problemas del espaciado al poner codigo
@Lucain
Me gustan este tipo de posts donde se explica un tema en especifico, es a mi parecer la forma mas limpia de aportar algo.

saludos, +5
@Maclu
+10 y a favoritos para tenerlo a mano
@vocin
+1 y a favs
@4RIEL
muy bueno, estoy sin puntos así que de momento de doy un globo
si fuera un usuario común de Taringa estaría diciendo: top top top!
@Ayortano
4RIEL dijo:muy bueno, estoy sin puntos así que de momento de doy un globo
si fuera un usuario común de Taringa estaría diciendo: top top top!

¿Para qué lanzar tres veces top? Con una sola vez ya se ejecuta el programa. Por otra parte, good post!
@Thierry
Buen post , me queme el cerebro para saber que programa era el de la primera foto , agregaria HTOP para que la gente sepa que programa es , link de la pagina http://htop.sourceforge.net/