Prioridades de proceso y control de jobs: nice, renice, bg, fg, jobs, nohup
Introducción
Linux permite ajustar la prioridad de los procesos para influir en cuánto tiempo de CPU reciben, y controlar si un proceso se ejecuta en primer o segundo plano. Estas habilidades son fundamentales para la administración de sistemas y forman parte del objetivo 103.5 del examen LPIC-1.
Prioridades de proceso: nice y renice
El kernel de Linux asigna tiempo de CPU a los procesos según su prioridad. Esta prioridad se
controla mediante el valor nice, que va de -20
(máxima prioridad, más agresivo) a +19 (mínima prioridad, más amable con los demás). El valor por defecto
es 0.
Nice -20 ←──── mayor prioridad (más CPU)
...
0 ←──── prioridad por defecto
...
+19 ←──── menor prioridad (menos CPU)
Solo root puede asignar valores nice negativos (aumentar la prioridad). Un usuario normal solo puede reducir la prioridad de sus propios procesos (valores positivos).
El valor nice se puede ver en la columna NI de top o htop, y en la
columna NICE de ps -l.
nice — Lanzar un proceso con una prioridad determinada
Lanza un comando asignándole un valor nice desde el principio.
Sintaxis:
nice [OPCIÓN] COMANDO [ARGUMENTOS]
Ejemplos:
$ nice tar -czf backup.tar.gz /home # nice +10 por defecto
$ nice -n 15 tar -czf backup.tar.gz /home # nice +15 (baja prioridad)
# nice -n -5 programa # nice -5 (alta prioridad, requiere root)
# Verificar el valor asignado:
$ nice
0
$ nice -n 10 bash -c 'nice'
10
nicesin argumentos muestra el valor nice del shell actual.-n Nespecifica el incremento de nice (puede ser positivo o negativo).- Si no se especifica
-n, aplica+10por defecto.
Caso de uso típico:
Lanzar tareas de mantenimiento pesadas (copias de seguridad, compresión, compilaciones) con nice alto para que no interfieran con los servicios del sistema:
$ nice -n 19 rsync -av /datos/ /backup/
renice — Cambiar la prioridad de un proceso en ejecución
Modifica el valor nice de uno o varios procesos que ya están corriendo.
Sintaxis:
renice PRIORIDAD [OPCIONES]
Ejemplos:
# renice -n 10 -p 1234 # cambiar nice del PID 1234 a +10
# renice -n 10 1234 # forma abreviada (PID implícito)
# renice -n -5 -p 1234 # aumentar prioridad (solo root)
# renice -n 5 -u juan # aplicar a todos los procesos del usuario juan
# renice -n 5 -g 1001 # aplicar a todos los procesos del grupo 1001
# Ver el resultado:
$ ps -l -p 1234
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 1234 1100 0 85 10 - 5432 - pts/0 0:05 tar
-p PID→ actuar sobre un proceso por su PID.-u USUARIO→ actuar sobre todos los procesos de un usuario.-g GRUPO→ actuar sobre todos los procesos de un grupo.- Con
renice, el valor indicado es el nuevo valor absoluto, no un incremento.
Control de jobs: primer y segundo plano
El shell permite gestionar varios procesos simultáneamente mediante el concepto de job (tarea). Un job puede estar en primer plano (foreground, recibe entrada del teclado) o en segundo plano (background, se ejecuta sin bloquear el terminal).
Lanzar un proceso en segundo plano con &:
$ tar -czf backup.tar.gz /home &
[1] 4521
$ ← el prompt vuelve inmediatamente
El shell muestra el número de job entre corchetes y el PID del proceso.
Suspender un proceso en primer plano:
Mientras un proceso corre en primer plano, pulsar Ctrl+Z lo suspende (pausa) y lo convierte en un job en segundo plano detenido:
$ vim fichero.txt
^Z
[1]+ Detenido vim fichero.txt
$
jobs — Listar jobs activos
Muestra los jobs del shell actual con su estado y número de job.
$ jobs
[1]- Detenido vim fichero.txt
[2]+ Ejecutando tar -czf backup.tar.gz /home &
$ jobs -l # incluye el PID de cada job
[1]- 4490 Detenido vim fichero.txt
[2]+ 4521 Ejecutando tar -czf backup.tar.gz /home &
+→ job actual (el que recibiráfgobgsin argumentos).-→ job anterior.-
Estados posibles:
Ejecutando(running),Detenido(stopped),Terminado(done).
fg y bg — Mover jobs entre planos
fg — Traer un job al primer plano:
$ fg # trae el job actual (marcado con +)
$ fg %1 # trae el job número 1
$ fg %vim # trae el job cuyo nombre empieza por "vim"
El job vuelve al primer plano y bloquea el terminal hasta que termine o se vuelva a suspender con Ctrl+Z.
bg — Reanudar un job suspendido en segundo plano:
$ bg # reanuda el job actual en segundo plano
$ bg %1 # reanuda el job número 1 en segundo plano
Útil cuando se ha suspendido un proceso con Ctrl+Z y se quiere que continúe ejecutándose en background.
Flujo típico:
$ rsync -av /datos/ /backup/ # lanzar en primer plano
^Z # suspender con Ctrl+Z
[1]+ Detenido rsync -av /datos/ /backup/
$ bg %1 # reanudar en segundo plano
[1]+ rsync -av /datos/ /backup/ &
$ jobs # verificar que sigue corriendo
[1]+ Ejecutando rsync -av /datos/ /backup/ &
nohup — Ejecutar sin colgar al cerrar sesión
Cuando se cierra una sesión de terminal, el shell envía la señal SIGHUP a todos sus procesos hijo,
lo que normalmente los termina. nohup hace que el proceso ignore esa señal, permitiendo que siga ejecutándose
aunque la sesión se cierre.
Uso:
$ nohup comando &
$ nohup rsync -av /datos/ /backup/ &
nohup: la entrada se ignora y la salida se añade a 'nohup.out'
[1] 4789
-
La salida estándar y de error se redirige automáticamente a
nohup.outen el directorio actual (o$HOME/nohup.outsi no tiene permisos de escritura). - Se recomienda usar siempre con
¶ que no bloquee el terminal. -
Para redirigir la salida a un fichero propio:
nohup comando > salida.log 2>&1 &
Alternativa moderna: disown
Si ya se lanzó un proceso en background con & y se quiere desvincularlo del shell sin usar nohup, se puede usar disown:
$ proceso-largo &
[1] 4800
$ disown %1 # desvincula el job 1 del shell
$ disown -a # desvincula todos los jobs
Tras disown, el proceso no aparece en jobs y no recibirá SIGHUP al cerrar sesión.
Resumen rápido
Comando Acción
─────────────────── ──────────────────────────────────────────────────
nice -n N cmd Lanzar cmd con prioridad nice N
renice -n N -p PID Cambiar la prioridad de un proceso ya en ejecución
cmd & Lanzar cmd en segundo plano
Ctrl+Z Suspender el proceso en primer plano
jobs Listar jobs del shell actual
fg %N Traer el job N al primer plano
bg %N Reanudar el job N suspendido en segundo plano
nohup cmd & Lanzar cmd ignorando SIGHUP (sobrevive al cierre de sesión)
disown %N Desvincular el job N del shell (sin SIGHUP al cerrar)