Cómo usar el comando nohup en Linux

Cómo usar el comando nohup en Linux

Computadora portátil Linux que muestra un indicador de bash
fatmawati achmad zaenuri/Shutterstock.com

el linux nohup El comando permite que los procesos importantes continúen ejecutándose incluso cuando l. a. ventana del terminal que los inició está cerrada. Le mostramos cómo usar este comando venerable en Linux de hoy.

HUP y SIGHUP

Unix, el antepasado de Linux, se creó antes de que se inventara l. a. 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 l. a. computadora a l. a. que estaba conectado, no en l. a. terminal en l. a. que estaba escribiendo. Los programas se estaban ejecutando en l. a. computadora, donde sea que se haya ubicado, y no en el dispositivo en su escritorio.

Si sucedió algo que interrumpió l. a. conexión entre su terminal y l. a. computadora, l. a. computadora detectó l. a. caída de l. a. línea y envió un HUP o colgar señal a los programas que había estado ejecutando. Los programas dejaron de ejecutarse cuando recibieron l. a. 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, el SIGHUP se envía señal a los programas para que estén informados de l. a. HUP y saber 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.

los nohup el comando inicia procesos secundarios pero se niega a pasar SIGHUP señales para ellos. 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 l. a. ventana de l. a. terminal desde l. a. que se inició está cerrada, necesita una forma de interceptar el SIGHUP para que el programa nunca lo reciba. (En realidad, l. a. ventana de terminal no inicia procesos, son iniciados por l. a. sesión de shell dentro de l. a. ventana de terminal). Los angeles solución easy y elegante a ese problema es colocar otro proceso entre l. a. sesión de shell y el programa, y ​​hacer que El programa de capa intermedia nunca pasa el SIGHUP señal.

eso es lo que nohup lo hace. Te lanza programas para que sean un proceso hijo de nohup, no un proceso hijo del shell. Debido a que no son un proceso secundario del shell, no recibirán directamente un SIGHUP de l. a. concha Y si nohup no pasa el 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 l. a. ventana de l. a. terminal y su caparazón, también terminará el proceso. Usando nohup para iniciar el proceso aísla el proceso de l. a. nohup señal. Si está trabajando de forma remota en una computadora a través de SSH y no desea que un proceso confidencial finalice si falla l. a. conexión remota, iniciaría el proceso en l. a. computadora remota con nohup .

usando nohup

Creamos un programa que no hace nada útil, pero se ejecutará y ejecutará hasta que finalice. Imprime l. a. hora en l. a. ventana del terminal cada tres segundos. Se llama long-proc para “proceso largo”.

./long-proc

El programa de proceso largo que ejecuta una ventana de terminal

Si este fuera un programa que hiciera algo útil y quisiéramos que siguiera ejecutándose incluso si l. a. ventana del terminal y el shell están cerrados, lo ejecutaríamos con nohup.

nohup ./long-proc

lanzando el programa the long-proc desde nohup

El proceso está desvinculado de stdin y stdout por lo que no puede recibir ninguna entrada ni escribir en l. a. ventana del terminal. Además, debido a que aún se está ejecutando, no regresa al símbolo del sistema. Todo lo que nohup hace que el proceso sea impermeable al cierre de l. a. terminal. No convierte el proceso en una tarea en segundo plano.

¿Ahora tiene que reiniciar solo para terminar el proceso? No. Para detener un nohup proceso que no haya iniciado como proceso en segundo plano, presione l. a. combinación de teclas Ctrl+C.

Detener el proceso de proceso largo con Ctrl+C

Los angeles salida del programa ha sido capturada para nosotros en un archivo llamado “nohup.out”. Podemos revisarlo con menos.

much less nohup.out

Abriendo el archivo nohup.out en menos

Todo lo que normalmente se enviaría a l. a. ventana del terminal se captura en el archivo. Ejecuciones posteriores de nohup se agregará al archivo “nohup.out” existente.

La salida de long-proc escrita en el archivo nohup.out, que se muestra en menos

Una forma más útil de ejecutar el proceso es iniciarlo con nohup para que resista el cierre de l. a. ventana del terminal, y al mismo tiempo que sea una tarea en segundo plano. Para ello añadimos un ampersand “&” al ultimate de l. a. línea de comando.

nohup ./long-proc &

iniciar el programa de proceso largo con nohup y convertirlo en una tarea en segundo plano

Deberá presionar “Input” una vez más para volver al símbolo del sistema. Se nos cube 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 l. a. ventana de terminal ni con el shell.

Si olvida cuál es el número de trabajo, puede utilizar el jobs Comando para enumerar las tareas en segundo plano que se han iniciado desde esa ventana de terminal.

jobs

Listado de las tareas en segundo plano que se han iniciado desde una ventana de terminal

Para acabar con nuestra tarea podemos usar el kill comando y el número de trabajo, precedido por un signo de porcentaje “%“, como esto:

kill %1

Si ha cerrado l. a. ventana de l. a. terminal, deberá encontrar el ID del proceso y usarlo con el kill dominio. los pgrep El comando encontrará el ID de proceso para los procesos que coincidan con l. a. pista de búsqueda que proporcione. Buscaremos el nombre del proceso.

pgrep long-proc

Encontrar el ID de proceso de un proceso por nombre

Ahora podemos usar l. a. ID del proceso para terminar el proceso.

kill 13115

Usar el comando kill y el ID del proceso para terminar un proceso

Los angeles próxima vez que presione “Input” se le informará que el proceso ha finalizado.

Ahora veamos qué no terminar el proceso. Lo relanzaremos y luego cerraremos l. a. ventana de l. a. terminal.

nohup ./long-proc

Cerrar la ventana de terminal con un proceso en ejecución

Si abrimos una nueva ventana de terminal y buscamos nuestro proceso con pgrep, vemos que todavía se está ejecutando. Cerrar l. a. ventana de terminal que inició el proceso no ha surtido efecto.

pgrep long-proc

Usando pgrep para buscar un proceso por nombre

Es posible pasar múltiples comandos a nohup, pero normalmente es mejor lanzarlos 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. Los angeles ejecución no es concurrente, es secuencial. Para que se ejecuten simultáneamente, debe iniciarlos por separado.

Habiendo dicho eso, para lanzar varios procesos a l. a. vez, use nohup para iniciar un shell Bash y usar el -c (comandos) opción con l. a. cadena de comandos. Utilice comillas simples “'” para envolver l. a. lista de comandos y el doble ampersand “&&” para separar los comandos.

nohup bash -c 'ls /bin && ls /sbin'

Lanzamiento de dos procesos con nohup

Si utiliza much less para revisar el archivo “nohup.out”, verá el resultado del primer proceso, luego el resultado del segundo proceso.

much less nohup.out

Abriendo el archivo nohup.out en menos

Los angeles salida de ambos comandos se ha capturado en el archivo “nohup.out”. No está entrelazado, l. a. salida del segundo proceso solo comienza una vez que el primer proceso ha terminado.

El contenido del archivo nohup.out en menos

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' > myfile.txt

redirigir la salida de los procesos a un archivo proporcionado por el usuario

Tenga en cuenta que el mensaje ya no cube “agregando salida a nohupo.out”, cube “redirigiendo stderr a stdout” y estamos redirigiendo stdout a nuestro archivo “myfile.txt”.

Podemos mirar dentro del archivo “myfile.txt” con menos.

much less myfile.txt

Como antes, contiene l. a. salida de ambos comandos.


Es curioso cómo l. a. historia de una empresa de servicios públicos a veces puede hacer que parezca que no tiene relevancia en los tiempos modernos. los nohup El comando 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 día en máquinas increíblemente potentes.

RELACIONADO: 37 comandos importantes de Linux que debe conocer