Un proceso podemos 

  • Pararlo/continuarlo
  • Matarlo
  • Terminarlo

Una vez hemos iniciado un proceso, podemos controlarlo desde la misma shell que lo inició, o, desde cualquier otro punto, si conocemos su PID. Si lo hemos iniciado desde una Shell, podemos haberlo hecho en primer Plano (foreground) o en segundo plano (backgroud). Un proceso en primer plano, ocupa el terminal, todas sus salidas pueden ir a él, y puede recibir entradas desde teclado, mientras que si lo iniciamos en segundo plano, el terminal nos queda libre inmediatamente, y no podemos enviarle datos desde teclado.

Para iniciar un proceso en primer plano utilizamos la forma conocida hasta el momento; tecleamos el comando y pulsamos Enter

Si queremos que el proceso corra en segundo plano, lo que deberemos hacer es añadir a la orden, en su extremo derecho, el simbolo &

Someter un comando en background

Aqui vemos como hemos lanzado el find en background; como respuesta recibimos el numero de trabajo dentro a este proceso y el PID que se le ha asignado

Si ahora necesitamos detener un proceso que corre en primer plano, utilizaremos Ctrl-Z. Este comando, no termina el proceso,  únicamente lo detiene, al pararlo, aunque sea Foreground, te informa del numero de proceso, que necesitaremos cuando queramos continuarlo; también podemos utilizar el comando jobs para ver todos los procesos detenidos, puede retomar el comando suspendido con fg o bg, segun deseemos continuar en primero o segundo plano, si  por el contrario deseo acabar el proceso, puedo utilizar

$ kill %1

siendo 1 el numero de trabajo.

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. Así 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 -19 1234          Envia la señal de stopd al PID 1234

$ kill -18 1234          Envia la señal de continuar al PID 1234

SI queréis probar este comportamiento, (os animo a hacerlo) , debéis preparar dos consolas, si utilizáis las gráficas  podréis compartir pantalla, en una de ellas os logonais como usuarios, y en la otra como root.

Ahora en la consola de usuario lanzáis un comando que tarde en procesar; según el equipo, podéis intentar:

$ find / pp

y después del Enter, que empezara a desfilar rutas por la terminal, pulsais Ctrl-Z, lo que pausara el proceso. A continuación, os vais al terminal de root y hacéis

ps a

os aparece la lista de procesos, tenéis que fijaros en el PID del proceso que tiene como comando «find / pp», supongamos que es el 2336. preparad el comando pero no deis Enter:

kill -19 2336

que es mandar señal de STOP al proceso 2336, ahora cambiáis al terminal de usuario, y utilizáis el comando

fg 1

y Enter para retomar el proceso; veréis que el desfile de path continua, cambiáis a la terminal de root y dais Enter para lanzar la orden preparada, y veréis que inmediatamente se detiene el listado de la terminal de usuario, si queréis que continúe  desde la terminal de root podéis hacer

kill -19 2336

y si decidís cancelarlo, basta con

kill 2336

Comentamos que cuando un proceso muere, todos sus hijos mueren, esto es especialmente grave cuando estamos hablando de procesos lanzados por el usuario, que desearíamos que continuaran aunque el usuario saliera del sistema.

Para conseguir eso, podemos lanzar el comando con nohup. Un proceso lanzado bajo nohup, tendrá como padre el proceso init, y por definición, debería ser un proceso de segundo plano

La prioridad de los procesos

Probad de hacer en vuestro terminal

$ ps lax

Puede que lo tengais que pausar con more, pero como resultado, encontrareis algo semejante a esto:

salida del comando ps lax

Y miráis la columna que esta bajo NI, es la prioridad del proceso Linux (nice), y si queréis ver con que prioridad se ejecutara un proceso que lancéis  podéis teclear en vuestra terminal el comando nice que os informara de la prioridad asignada (habitualmente cero)

Todo esto se enmarca en el siguiente entorno:

  • Los sistemas Linux y UNIX® usan un sistema de prioridades con 40 prioridades, que van desde -20 (prioridad más alta) hasta 19 (prioridad más baja).
  • Los procesos iniciados por usuarios regulares normalmente tienen una prioridad de 0.
  • El comando ps puede mostrar la prioridad (NI) usando la opción -l .
  • El comando nice muestra nuestra prioridad predeterminada.

El comando nice también nos permite modificar la prioridad de un proceso frente al resto dentro del sistema. El kernel Linux es el encargado de planificar y asignar tiempo de CPU a cada uno de los procesos que corren en el sistema, pero para hacerlo, se basara en la prioridad que hayamos podido asignar a nuestro proceso

La sintaxis del comando nice es la siguiente:

# nice -n<PRIORIDAD> COMANDO

Si queremos asignar la máxima prioridad al proceso prueba.sh, podemos hacer:

# nice -n-20 ./prueba.sh

mientras que si queremos asignar la minima prioridad haremos:

# nice -n20 ./prueba.sh

Si necesitamos cambiar la prioridad de un proceso despues de que este haya sido lanzado, disponemos del comando renice con sintaxis renice <prioridad><PID>:

# renice 15 1234

La herramienta top

Esta herramienta nos informa en una terminal no gráfica  de los procesos que hay corriendo en una CPU refrescando la informacion cada pocos segundos. Ademas, podemos configurar la salida para que nos informe de los datos que mas nos interesan

Unos comandos útiles

pgrep

Devuelve el ID del proceso que coincide con la búsqueda:

$ pgrep firefox

pkill & killall

Estos comandos pueden matar procesos dando el nombre del mismo.

Y algo mas

He encontrado en http://rm-rf.es/linux-listar-procesos-cpu-memoria/ un par de comandos, que pienso que os pueden ser utiles, por lo que podeis crear alias con ellos, ya que son un poco largo de picar.

El primero nos permite listar los procesos ordenados por ocupación de cpu

ps -e -o pcpu,cpu,nice,state,cputime,args --sort pcpu | sed '/^ 0.0 /d'

el segundo, segun ocupacion de memoria

ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS

 

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.