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 &
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:
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