Cómo usar el comando nohup en Linux
Publicado: 2022-06-25 El comando nohup
de Linux permite que los procesos importantes continúen ejecutándose incluso cuando la ventana del terminal que los inició está cerrada. Le mostramos cómo usar este venerable comando en el Linux actual.
HUP y SIGHUP
Unix, el antepasado de Linux, se creó antes de que se inventara la PC. Las computadoras eran equipos grandes y costosos. Las personas interactuaban con ellos a través de líneas seriales, ya sea localmente dentro del mismo edificio o de forma remota a través de conexiones de módem lentas. Originalmente, escribieron sus instrucciones en teleimpresoras que fueron reemplazadas gradualmente por terminales tontas.
Fueron llamados tontos porque el poder de procesamiento estaba en la computadora a la que estaba conectado, no en la terminal en la que estaba escribiendo. Los programas se estaban ejecutando en la computadora, donde sea que se haya ubicado, y no en el dispositivo en su escritorio.
Si sucedía algo que interrumpía la conexión entre su terminal y la computadora, la computadora detectaba la caída de la línea y enviaba una señal HUP
o colgaba a los programas que había estado ejecutando. Los programas dejaron de ejecutarse cuando recibieron la señal.
Esa funcionalidad vive en Linux hoy. En su PC, una ventana de terminal es una emulación de una terminal física. Si tiene procesos en ejecución que se iniciaron desde esa ventana de terminal y cierra esa ventana, la señal SIGHUP
se envía a los programas para que estén informados del HUP
y sepan que deben terminar.
Se produce un efecto cascada. Si los procesos han lanzado procesos secundarios, SIGHUP también se les pasa a ellos para que sepan que deben terminar.
El comando nohup
inicia procesos secundarios pero se niega a pasarles señales SIGHUP
. Eso puede sonar como un problema, pero en realidad es una función útil.
El comando nohup
Si desea que un proceso continúe incluso si la ventana de la terminal desde la que se inició está cerrada, necesita una forma de interceptar el SIGHUP
para que el programa nunca lo reciba. (En realidad, la ventana de terminal no inicia procesos, son iniciados por la sesión de shell dentro de la ventana de terminal). La solución simple y elegante a ese problema es colocar otro proceso entre la sesión de shell y el programa, y hacer que El programa de capa intermedia nunca transmite la señal SIGHUP
.
Eso es lo que hace nohup
. Lanza programas para que sean un proceso secundario de nohup
, no un proceso secundario del shell. Debido a que no son un proceso secundario del shell, no recibirán directamente un SIGHUP
del shell. Y si nohup
no pasa SIGHUP
a sus hijos, el programa no recibirá SIGHUP
en absoluto.
Esto es útil cuando, por ejemplo, tiene un proceso de ejecución prolongada que necesita dejar que se ejecute hasta su finalización. Si cierra accidentalmente la ventana de la terminal y su caparazón, también terminará el proceso. El uso de nohup
para iniciar el proceso aísla el proceso de la señal de nohup
. Si está trabajando de forma remota en una computadora a través de SSH y no desea que un proceso confidencial finalice si falla la conexión remota, debe iniciar el proceso en la computadora remota con nohup
.
usando nohup
Creamos un programa que no hace nada útil, pero se ejecutará y ejecutará hasta que finalice. Imprime la hora en la ventana del terminal cada tres segundos. Se llama long-proc
para "proceso largo".
./proceso largo
Si este fuera un programa que hiciera algo útil y quisiéramos que siguiera ejecutándose incluso si la ventana del terminal y el shell están cerrados, lo ejecutaríamos con nohup
.
nohup ./long-proc
El proceso está desacoplado de stdin
y stdout
, por lo que no puede recibir ninguna entrada ni escribir en la ventana del terminal. Además, debido a que aún se está ejecutando, no regresa al símbolo del sistema. Todo lo que hace nohup
es hacer que el proceso sea impermeable al cierre de la terminal. No convierte el proceso en una tarea en segundo plano.
¿Ahora tiene que reiniciar solo para terminar el proceso? No. Para detener un proceso nohup
que no haya iniciado como proceso en segundo plano, presione la combinación de teclas Ctrl+C.
La salida del programa ha sido capturada para nosotros en un archivo llamado "nohup.out". Podemos revisarlo con menos.
menos nohup.fuera
Todo lo que normalmente se enviaría a la ventana del terminal se captura en el archivo. Las ejecuciones posteriores de nohup
se agregarán al archivo "nohup.out" existente.
Una forma más útil de ejecutar el proceso es iniciarlo con nohup
para que resista el cierre de la ventana del terminal y convertirlo en una tarea en segundo plano al mismo tiempo. Para hacer esto, agregamos un ampersand " &
" al final de la línea de comando.
nohup ./long-proc &
Deberá presionar "Enter" una vez más para volver al símbolo del sistema. Se nos dice que el número de trabajo del proceso es 1, el número entre paréntesis " []
", y que el ID del proceso es 13115.
Podemos usar cualquiera de estos para terminar el proceso. “Ctrl+C” no funcionará ahora porque el programa no tiene ninguna asociación ni con la ventana de terminal ni con el shell.
Si olvida cuál es el número de trabajo, puede usar el comando de jobs
para enumerar las tareas en segundo plano que se han iniciado desde esa ventana de terminal.
trabajos
Para matar nuestra tarea podemos usar el comando kill
y el número de trabajo, precedido por un signo de porcentaje “ %
”, así:
matar a %1
Si ha cerrado la ventana de la terminal, deberá encontrar la ID del proceso y usarla con el comando kill
. El comando pgrep
encontrará el ID de proceso para los procesos que coincidan con la pista de búsqueda que proporcione. Buscaremos el nombre del proceso.
pgrep proceso largo
Ahora podemos usar la ID del proceso para terminar el proceso.
matar 13115
La próxima vez que presione "Enter" se le informará que el proceso ha finalizado.
Ahora veamos lo que no termina el proceso. Lo relanzaremos y luego cerraremos la ventana de la terminal.
nohup ./long-proc
Si abrimos una nueva ventana de terminal y buscamos nuestro proceso con pgrep
, vemos que aún se está ejecutando. Cerrar la ventana de terminal que inició el proceso no ha surtido efecto.
pgrep proceso largo
Es posible pasar varios comandos a nohup
, pero normalmente es mejor ejecutarlos por separado. Hace que sea más fácil manipularlos como trabajos en segundo plano. Los comandos no se ejecutarán al mismo tiempo, se ejecutarán uno tras otro. La ejecución no es concurrente, es secuencial. Para que se ejecuten simultáneamente, debe iniciarlos por separado.
Habiendo dicho eso, para iniciar varios procesos a la vez, use nohup
para iniciar un shell Bash y use la opción -c
(comandos) con la cadena de comandos. Use comillas simples “ '
” para envolver la lista de comandos y doble ampersand “ &&
” para separar los comandos.
nohup bash -c 'ls /bin && ls /sbin'
Si usa less
para revisar el archivo "nohup.out", verá el resultado del primer proceso y luego el resultado del segundo proceso.
menos nohup.fuera
La salida de ambos comandos se ha capturado en el archivo "nohup.out". No está entrelazado, la salida del segundo proceso solo comienza una vez que el primer proceso ha terminado.
Si desea utilizar un archivo propio en lugar de "nohup.out", puede redirigir el comando al archivo de su elección.
nohup bash -c 'ls /bin && ls /sbin' > miarchivo.txt
Tenga en cuenta que el mensaje ya no dice "agregando salida a nohupo.out", dice "redirigiendo stderr a stdout" y estamos redirigiendo stdout a nuestro archivo "myfile.txt".
Podemos mirar dentro del archivo "myfile.txt" con menos.
menos miarchivo.txt
Como antes, contiene la salida de ambos comandos.
Es curioso cómo la historia de una empresa de servicios públicos a veces puede hacer que parezca que no tiene relevancia en los tiempos modernos. El comando nohup
es uno de esos. Algo que se creó para hacer frente a las desconexiones en las líneas serie sigue siendo útil para los usuarios de Linux de hoy en máquinas increíblemente potentes.
RELACIONADO: 37 comandos importantes de Linux que debe conocer