GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cuándo usar Nohup?

Me gustaría saber el propósito de nohup estos días .

Pregunto porque leí esto

Nohup es la abreviatura de "No Hangups". No es un comando que ejecutas solo. Nohup es un comando complementario que le dice al sistema Linux que no detenga otro comando una vez que se haya iniciado. Eso significa que seguirá ejecutándose hasta que termine, incluso si el usuario que lo inició cierra la sesión. La sintaxis de nohup es simple y se parece a esto:

nohup sh tu-script.sh &

Observe el "&" al final del comando. Eso mueve el comando al fondo, liberando la terminal en la que estás trabajando.

Nohup funciona con casi cualquier comando que ejecute en la terminal. Se puede ejecutar con scripts personalizados, así como con comandos de sistema estándar y utilidades de línea de comandos.

Con el uso de distribuciones de Linux como SLES 11.4 o RHEL/CentOS 7.x, puedo

  • Inicio de sesión remoto en Linux a través de la red a través de SSH
  • Ejecute el programa simple a continuación, o cualquier otro, haciendo ./a.out &
  • cierre sesión en Linux; escriba exit en la terminal Puty SSH
  • mi programa de muestra a continuación, o cualquier otro, incluidos los scripts de shell bash, csh o tcsh, se ejecutan perfectamente sin necesidad de nohup
  • Escribiendo exit en PuTTY para cerrar una sesión SSH, creo que eso califica como un cierre de sesión.

¿Hay algún propósito o valor con nouhup? ¿hoy dia? ¿Es una cosa del kernel>=3.x? Por el tiempo que puedo recordar (kernel>=2.6) nunca he usado nohup y siempre he usado & sin problemas.

¿Puede alguien darme un escenario práctico donde nohup se utilizaría?

#include <stdlib.h>
#include <stdio.h>

/*
    sample C code, to print numbers to a file named zz.tmp
    the numbers 0 to 29 over 30 seconds
*/

int main ( int argc, char *argv[] )
{
   FILE *fp;
   int i;

   i = 0;
   fp = fopen("zz.tmp", "w" );

   while ( i < 30 )
   {
      fprintf( fp, "%dn", i++ );
      sleep( 1 );
   }
   fclose( fp );
   return 0;
}

misueño.sh

#!/bin/bash

sleep 1000

En Centos 7.7, inicio de sesión de optiplex pc con teclado y mouse, mi cuenta es bash. Hago nohup ./mysleep.sh y luego control-z . Al escribir jobs Veo [1]+ Stopped nohup ./mysleep.sh

Un ps -ef | grep mysleep muestra que la identificación del proceso existe, pero si cierro la ventana de la terminal a través de X en la esquina superior derecha, ese proceso desaparece, por lo que parece nohup no funciona?

Respuesta aceptada:

inicio de sesión remoto en linux a través de la red a través de SSH … cerrar sesión en linux; escribe exit en la terminal SSH de masilla

¿Puede alguien darme un escenario práctico donde nohup se utilizaría?

Por supuesto. Suponiendo que su shell sea bash (vea a continuación por qué), en lugar de escribir exit o ^D , escriba ~. al comienzo de una línea, lo que hará que su cliente ssh se desconecte :

$ ssh localhost
ssh$ sleep 3600 &
[1] 5765
ssh$ ~.
ssh$ Connection to localhost closed.
$ ps 5765
  PID TTY      STAT   TIME COMMAND

Puedes usar tu programa en lugar de sleep; y en lugar de desconectarse a través de ~. , puede matar a su cliente ssh o bloquear la máquina en la que se ejecuta. ¿Quieres que tu proceso sobreviva a esto? Usa nohup 😉

Relacionado:Debian:¿por qué 'ls' de repente envuelve elementos con espacios entre comillas simples?

Romper la conexión hará que el proceso del servidor que administra su otro extremo se cierre, lo que provocará que el kernel (cualquier kernel de Unix/Linux) elimine el pseudo-terminal que ssh había creado y envíe un SIGHUP señal al líder de la sesión (el shell bash), que según el manual bash:

El shell sale de forma predeterminada al recibir un SIGHUP . Antes de salir,
un shell interactivo reenvía el SIGHUP a todos los trabajos, en ejecución o
detenidos. Los trabajos detenidos se envían SIGCONT para asegurarse de que reciben el SIGHUP .

Mucha gente confunde esta función bash con a) el control de trabajo regular implementado por el kernel, que solo enviará un SIGCONT /SIGHUP par al detenido , no a la corrida trabajos [1] y b) otra función bash (shopt -s huponexit ) que provoca un inicio de sesión bash shell para enviar un SIGHUP a sus trabajos incluso cuando sale normalmente (por ejemplo, a través de exit ).

[1] un detenido trabajo es un trabajo (=grupo de procesos) que contiene al menos un proceso detenido. Un proceso se detiene como efecto de la acción predeterminada de una señal como SIGTSTP , SIGSTOP , SIGTTIN o SIGTTOU . Procesos que están "durmiendo" en una llamada al sistema de bloqueo como read , nanosleep , select , etc. no se consideran detenidos, sino en ejecución.

¿Por qué nohup? no siempre puede ayudar

nohup simplemente establece la disposición de SIGHUP para ignorar y hace algunas redirecciones, no garantiza que el proceso no será eliminado de otras formas.

a) Si el nohup .. el trabajo está detenido , un bash interactivo también le enviará un SIGTERM señal, no solo un SIGHUP /SIGCONT pareja:

Si se hace un intento de salir de bash mientras los trabajos están detenidos […] el shell imprime un mensaje de advertencia […] Si se hace un segundo intento de salir sin un comando intermedio, el shell no imprime otra advertencia, y cualquier trabajo detenido se terminado .

[terminado =envió un SIGTERM señal; esta es otra característica ksh/bash, no presente en todos los shells]

Todo esto se puede solucionar con trucos simples como bifurcaciones dobles y creando una nueva sesión con setsid(1) , pero

b) systemd también puede "limpiar" una sesión cerrada eliminando a la fuerza (con SIGTERM seguido de SIGKILL ) cualquier proceso sobrante si es KillUserProcesses la configuración está activada, que es la predeterminada en algunas distribuciones.


Linux
  1. Ssh:¿restringir un usuario de Ssh/scp/sftp a un directorio?

  2. ¿Cuándo y por qué debo usar Apt-get Update?

  3. Uso de SSH para abrir la aplicación en el escritorio

  4. Mantener una aplicación Java ejecutándose cuando SSH está cerrado en Google Cloud

  5. retraso ssh al conectar

Use este útil script de Bash cuando observe las estrellas

Cómo utilizar el reenvío de puertos SSH

Cómo usar el comando nohup de Linux

Cómo usar SSH para conectarse a un servidor remoto

Cómo usar una clave SSH con usuarios no root

Instalar y usar WinSCP