LINUX

Comando Nohup con ejemplos

Nohup significa ‘no hang up’ y, como su nombre lo indica, evita que el comando se cancele automáticamente cuando cierra sesión o sale del shell.

Cuando ejecuta un comando de Linux y cierra la sesión después de un tiempo de la sesión si ese comando no ha terminado de ejecutarse, su proceso se eliminará.

Hay todo tipo de programas que requieren muchas horas para completarse. No necesitamos esperar a que el comando complete toda la tarea. Podemos mantener los programas ejecutándose en segundo plano usando el comando nohup y verificar la salida más tarde.

Sintaxis del comando nohup

La sintaxis del comando nohup es:

nohup COMMAND [ARG]...

De forma predeterminada, la salida de un comando se muestra en el dispositivo de salida estándar, que es el terminal que inició el proceso. Pero como el terminal puede estar cerrado durante la vida del proceso secundario, el terminal ya no puede ser el dispositivo de salida. Según la página de información del comando nohup,

If standard output is a terminal, the command's standard output is appended to the file `nohup.out'; if that cannot be written to, it is appended to the file `$HOME/nohup.out'; and if that cannot be written to, the command is not run. Any `nohup.out' or `$HOME/nohup.out' file created by `nohup' is made readable and writable only to the user, regardless of the current umask settings.

De manera similar para el error estándar,

If standard error is a terminal, it is normally redirected to the same file descriptor as the (possibly-redirected) standard output. However, if standard output is closed, standard error terminal output is instead appended to the file `nohup.out' or `$HOME/nohup.out' as above.

Significa que, de forma predeterminada, tanto la salida estándar como el error estándar se redirigen al archivo ‘nohup.out’. Pero si desea redirigir la salida a algún otro archivo, siempre puede hacerlo utilizando el operador de redireccionamiento. Por ejemplo, para capturar la salida de make,

nohup make > make.log

Para entrada estándar,

If standard input is a terminal, it is redirected from `/dev/null' so that terminal sessions do not mistakenly consider the terminal to be used by the command. This is a GNU extension; programs intended to be portable to non-GNU hosts should use `nohup COMMAND [ARG]...

El comando nohup no pone automáticamente el comando en segundo plano. Esto debe hacerse explícitamente con &.

nohup make > make.log &

Además, este comando no cambia la bondad (es decir, la prioridad) de un comando. Para esto, el comando nice se usa como, por ejemplo, ‘nohup nice COMMAND’.

Cómo usar el comando nohup

Podemos utilizar nohup de dos formas. Primero está ejecutando el comando con parámetros sin recibir ninguna otra entrada mientras trabaja. Todos los resultados, incluidos los mensajes de error, se escribirán en el archivo nohup.out en el directorio de trabajo o en su directorio de inicio. Si el comando aún se está ejecutando cuando cierra la sesión o cierra la terminal, no terminará.

Probemos un ejemplo con la aplicación memtester.

$ nohup sudo memtester 2048 5
nohup: ignoring input and appending output to 'nohup.out'
Killed

$ cat nohup.out 
memtester version 4.3.0 (64-bit)
Copyright (C) 2001-2012 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).

pagesize is 4096
pagesizemask is 0xfffffffffffff000
want 2048MB (2147483648 bytes)
got  1876MB (1968074752 bytes), trying mlock ...

También puede redirigir la salida a algún otro archivo en lugar de nohup.out usando el símbolo>.

$ nohup sudo memtester 2048 5 > result.txt

Use el comando nohup con ‘&’

Para iniciar un proceso y ponerlo en segundo plano, básicamente ejecuta el comando seguido del símbolo «&». El símbolo «&» al final del comando indica a bash que se ejecute nohup yourcommand en el fondo. Puede devolverse al primer plano con el comando fg.

$ nohup bash sleep1.sh &
[1] 653
$ nohup: ignoring input and appending output to 'nohup.out'
fg
-bash: fg: job has terminated
[1]+  Exit 127                nohup bash sleep1.sh

Ejecuta varios comandos en segundo plano

Puede ejecutar varios comandos en segundo plano utilizando el comando nohup. En el siguiente ejemplo, los comandos mkdir, touch y ls se ejecutan en segundo plano mediante los comandos nohup y bash.

$ nohup bash -c 'mkdir TestDir && touch test2.file && ls'> output.txt
nohup: ignoring input and redirecting stderr to stdout

$ cat output.txt 
TestDir
nohup.out
output.txt
test2.file
testfile.txt

Inicio y finalización del proceso en segundo plano

Si ejecuta el comando ping usando nohup, el proceso no terminará cuando cierre la terminal.

$ nohup ping -i 15 linoxide.com &
[1] 806
$ nohup: ignoring input and appending output to 'nohup.out'

Puede cerrar la terminal y volver a abrirla. Ahora ejecute el comando pgrep con -a opción.

$ pgrep -a ping
816 ping -i 15 linoxide.com

Obtendrá la lista de procesos con la identificación del proceso que se está ejecutando. Como puede ver, el comando ping que dejamos en ejecución no finaliza. Para finalizar cualquier proceso en segundo plano, debe ejecutar el comando kill. Como parámetro, debemos usar el ID de proceso particular que se está ejecutando.

En nuestro caso, la identificación del proceso es 816. Ejecute kill 816 para terminar el proceso.

$ pgrep -a ping
816 ping -i 15 linoxide.com
$ kill 816

Conclusión

Nohup es muy útil cuando tienes que ejecutar scripts de shell. Tmux, Screen y Disown son algunas de las utilidades alternativas que hacen el mismo trabajo que nohup.

Espero que ahora esté familiarizado con esta herramienta que puede ser útil en muchos casos. Si tiene alguna pregunta o comentario, publíquelos a continuación.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar