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
          
  • nice sin argumentos muestra el valor nice del shell actual.
  • -n N especifica el incremento de nice (puede ser positivo o negativo).
  • Si no se especifica -n, aplica +10 por 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á fg o bg sin 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.out en el directorio actual (o $HOME/nohup.out si no tiene permisos de escritura).
  • Se recomienda usar siempre con & para 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)
          

Para el examen LPIC-1 (objetivo 103.5): dominar nice, renice, el uso de &, Ctrl+Z, jobs, fg, bg y nohup.

rsyslog: el demonio de logs del sistema

Índice de la sección

Índice del curso