¡Hola queridos lectores!, quiero empezar mi primera entrada en el blog, con un tema que he dado recientemente en clase que es: la administración de procesos en sistemas Linux.
Antes de mostrar los comandos para administrar los procesos, quiero daros una información amplía de los procesos.
Un proceso es la representación de un Sistema Operativo en ejecución, es decir, es un programa ejecutable. Un programa ejecutable se define mediante unos códigos y una definición de datos. Para poner un proceso en ejecución necesitamos asignarle memoria e inicializar los registros de la cpu para que pueda ser ejecutado. Un proceso puede ser un proceso ''Padre'' que crea procesos ''H'ijos'', al acabar con un proceso padre acabamos con los procesos hijos, si acabamos los procesos hijos, no nos cargamos el proceso padre.
Para gestionar estos procesos, el sistema utiliza una estructura de datos llamada PCB (Process Control Block).
Por último, un proceso tiene distintos estados:
- RUN: el proceso tiene asignada una CPU y está ejecutandose.
- READY: el proceso está preparado para ejecutarse pero está esperando que se le asigne una CPU.
- BLOCKED: el proceso no tiene/consume CPU, está bloqueado esperando a que termine entrada/salida de datos o la llegada de un evento.
- ZOMBIE: el proceso ha terminado su ejecución pero aún no ha desaparecido, esto ocurre cuando nos cargamos un proceso padre y este no ha notificado a los procesos hijos.
Ahora sí, después de esta breve información de los procesos, pasamos a conocer algunos de los comandos para administrar procesos en Linux:
ps
El comando es el que permite informar sobre el estado de los procesos.
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 son las siguientes:
- 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 --
- Estilo UNIX, donde las opciones van precedidas por un 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 camndo que inició el proceso | |
RSS | Resident Sise, tamaño de la parte residente en memoria en kilobytes | |
SZ o SIZE | Tamaño virtual de la imagen del proceso | |
NI | 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
|
Las opciones completas de las encuentras en las páginas del manual (), o escribiendo en la terminal , y para ver un resumen de sus opciones más comunes usa :
#> 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
A continuación algunos cuantos ejemplos de con la salida recortada.
># ps -e
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
#> ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 10:12 ? 00:00:01 init [5]
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
sergon 6343 5604 0 10:28 ? 00:00:00 kio_file [kdeinit] file /home/sergon/tmp/ksocket-sergon/kl
root 6475 6134 0 10:38 pts/0 00:00:00 ps -ef
#> ps -eF
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 1 0 0 412 556 1 16:59 ? 00:00:01 init [5]
root 2 0 0 0 0 1 16:59 ? 00:00:00 [kthreadd]
sergon 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
sergon 8331 8326 4 53856 62604 0 17:07 ? 00:00:50 /usr/lib/firefox-2.0.0.8/mozilla-firefox-bin
sergon 8570 7726 2 15211 37948 0 17:17 ? 00:00:10 quanta
#> ps ax
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 init [5]
2 ? S< 0:00 [kthreadd]
3 ? S< 0:00 [migration/0]
4 ? S< 0:00 [ksoftirqd/0]
#> ps aux
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 [5]
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]
#> ps -eo user,pid,tty
USER PID TT
root 1 ?
root 2 ?
sergon 8570 tty 1
root 8876 pts/1
#> ps -eH
#> ps axf
#> ps -ec
#> ps -el
#> ps L
pstree
Muestra los procesos en forma de árbol,
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:
#> pstree -AGu
init---acpid
|-atd(daemon)
|-automount----2*[{automount}]
|-avahi-daemon(avahi)
|-beagled(sergon)----7*[{beagled}]
|-beagled-helper(sergio)----3*[{beagled-helper}]
|-compiz(sergon)----kde-window-deco
|-console-kit-dae----61*[{console-kit-dae}]
|-crond
|-dbus-daemon(messagebus)
|-dbus-daemon(sergio)
|-dbus-launch(sergio)
|-dcopserver(sergio)
|-dhclient
|-gam_server(sergio)
|-gconfd-2(sergio)
|-hald(haldaemon)----hald-runner(root)----hald-addon-acpi(haldaemon)
| |-hald-addon-cpuf
| |-hald-addon-inpu
| |-hald-addon-stor
|-httpd---8*[httpd(apache)]
|-2*[ifplugd]
|-ipw3945d
|-kaccess(sergio)
...
kill
El comando , 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 , 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.
#> 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 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:
#> kill -9 11428
#> kill -SIGKILL 11428
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.
killall
El comando , que funciona de manera similar a ,
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 eliminará todos los procesos que se esten ejecutando con el nombre 'squid'
#> killall -l
#> killall -HUP httpd
#> killall -KILL -i squid
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
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 es posible observar la columna NI que muestra este valor.
#> nice
0
#> nice -n -5 comando
renice
Asi como establece la prioridad de un proceso cuando se incia su ejecución, permite alterarla en tiempo real, sin necesidad de detener el proceso.
#> nice -n -5 yes
#> ps -el
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 12826 12208 4 75 -5 - 708 write_ pts/2 00:00:00 yes
#> renice 7 12826
12826: prioridad antigua -5, nueva prioridad 7
#> ps -el
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 12826 12208 4 87 7 - 708 write_ pts/2 00:00:15 yes
nohup y &
Cuando se trata ejecutar procesos en background (segundo plano) se utiliza el comando 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).
$> yes > /dev/null &
$> tar czf respaldo /documentos/* > /dev/null/ &
$> konqueror &
Sin embargo lo anterior produce que el padre del proceso PPID que se
invocó 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
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.
$> nohup yes > /dev/null &
$> nohup czf respaldo /documentos/* > /dev/null/
$> nohup konqueror
Asi se evita que el proceso se "cuelgue" al cerrar la consola.
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 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 que lista los procesos actuales en ejecución:
#> yes > /dev/null &
[1] 26837
#> ls -laR > archivos.txt &
[2] 26854
#> jobs
[1]- Running yes >/dev/null &
[2]+ Running ls --color=tty -laR / >archivos.txt &
En el ejemplo previo, se ejecutó el comando
y se envió a background (&) y el sistema devolvió [1] 26837,
indicando asi que se trata del trabajo o de la tarea [1] 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 (foreground) y
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 :
#> jobs
[1]- Stopped yes >/dev/null &
[2]+ Stopped ls --color=tty -laR / >archivos.txt &
#> fg %1
#> jobs
[1]+ Running yes >/dev/null &
[2]- 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 que volvería a reinicar el proceso pero en segundo plano. Y también es posible matar los procesos con indicando el número que devuelve : , terminaría con el proceso en número 1.
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 , se ejecuta desde la línea de comandos, es interactivo y por defecto se actualiza cada 3 segundos.
$> top
top - 13:07:30 up 8 days, 6:44, 4 users, load average: 0.11, 0.08, 0.08
Tasks: 133 total, 1 running, 131 sleeping, 0 stopped, 1 zombie
Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 497356k total, 472352k used, 25004k free, 21500k buffers
Swap: 1156640k total, 257088k used, 899552k free, 60420k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
26156 sergon 15 0 2160 1016 784 R 1 0.2 0:00.93 top
1 root 15 0 2012 616 584 S 0 0.1 0:00.98 init
2 root RT 0 0 0 0 S 0 0.0 0:00.29 migration/0
3 root 34 19 0 0 0 S 0 0.0 0:00.00 ksoftirqd/0
4 root RT 0 0 0 0 S 0 0.0 0:00.00 watchdog/0
5 root RT 0 0 0 0 S 0 0.0 0:00.38 migration/1
...
Estando adentro de la apliación, presionando 'h' muestra una ayuda de los posibles comandos que permiten configurar , por ejemplo, al presionar 's' pregunta por el tiempo en segundos de actualización, etc.
Estos son los comandos principales para la administración de procesos en Sistemas Operativos Linux, aunque existen otro comandos como por ejemplo: atop, xkill, pkill, pgrep, etc.
Estos son los comandos principales para la administración de procesos en Sistemas Operativos Linux, aunque existen otro comandos como por ejemplo: atop, xkill, pkill, pgrep, etc.
¡SI TE HA GUSTADO EL POST COMPARTELO, SI TIENES ALGUNA PREGUNTA O SUGERENCIA PUEDES DEJÁRMELO EN LOS COMENTARIOS!
No he entendido mucho, pero espero que sigas con este proyecto y te vaya muy bien
ResponderEliminar_(:3 ⌒゙)_
Jaajaja Gracias, si me gustaría documentar toda la información en este blog para acceder fácilmente en un futuro a estos conocimientos xD
EliminarMadre mía vaya pechada de escribir te has echado XD, esta muy bien echo y explicado seguramente lo yenga de chuleta XDDD, esta guapo el blog tío espero que te siga gustando esto
ResponderEliminarYo tengo el Blog para documentarlo todo y también le pueda servir a otra gente. Espero que encuentres cosas que te puedan resolver dudas. Cualquier cosilla me lo puedes dejar en los comentarios y te intento echar una mano.
EliminarGracias tio, un saludo y nos vemos!! =)
Justamente ayer te lo iba a comentar por Twitter. Yo estuve aplazando la idea de crear el blog y todavía me arrepiento.
ResponderEliminarSe dan muchas cosas de las que escribir y sin embargo se acaba documentando en un fichero casi a la ligera... xD
Saludos.
La verdad es que todo queda mejor documentando en un Blog y después puedes acceder desde cualquier sitio mientras tengas internet.
EliminarSaludos tio ^^