La mayor parte del tiempo que inicia sesión en el servidor remoto a través de ssh. Si inicia un script de shell o un comando y sale (aborta la conexión remota), el proceso/comando será asesinado. A veces un trabajo o comando toma mucho tiempo. Si no está seguro de cuándo terminará el trabajo, entonces es mejor dejar el trabajo en segundo plano., Pero, si cierra sesión en el sistema, el trabajo será detenido y terminado por su shell. ¿Qué haces para mantener el trabajo funcionando en segundo plano cuando el proceso se suspira?
nohup command to the rescue
en estas situaciones, podemos usar nohup
command line-utility que permite ejecutar comando / proceso o shell script que puede continuar ejecutándose en segundo plano después de cerrar sesión en un shell.
nohup es un comando POSIX para ignorar la señal HUP (hangup)., La señal HUP es, por convención, la forma en que un terminal advierte a los procesos dependientes de cerrar sesión.
la salida que normalmente iría al terminal va a un archivo llamado nohup.hacia fuera si no se ha redirigido ya.
nohup comando sintaxis:
la sintaxis es La siguiente
$ nohup command-name &$ exit
o
$ nohup /path/to/command-name arg1 arg2 > myoutput.log &$ exit
Donde
-
command-name
: es el nombre de secuencia de comandos de shell o el nombre del comando. Puede pasar el argumento al comando o a un script de shell., -
&
: nohup no pone automáticamente el comando que ejecuta en segundo plano; debe hacerlo explícitamente, terminando la línea de comandos con un símbolo &. -
exit
: después de nohup y & iniciar el comando en segundo plano, todavía tendrá que escribir exit o CTRL-D para volver al cursor bash.,
Use el comando jobs-l para listar todos los trabajos:
$ jobs -l
ejemplos de comandos nohup
primero, inicie sesión en el servidor remoto usando el comando ssh:
$ ssh [email protected]
voy a ejecutar un script de shell llamado pullftp.sh:
$ nohup pullftp.sh &
escriba exit o presione CTRL + D para salir del servidor remoto:
> exit
en este ejemplo, voy a encontrar todos los programas y scripts con el bit setuid activado, ingrese:
$ nohup find / -xdev -type f -perm +u=s -print > out.txt &
escriba exit o presione CTRL + D para salir del servidor remoto., El trabajo sigue funcionando después de que salgas.
> exit
nohup se usa a menudo en combinación con el comando nice para ejecutar procesos con una prioridad menor.
tenga en cuenta que nohup no cambia la prioridad de programación del comando; use el comando nice para ese propósito. Por ejemplo:
$ nohup nice -n -5 ls / > out.txt &
como puede ver, nohup mantiene los procesos en ejecución después de salir de un shell. Lea la página man de nohup (1) y nice(1) para más información. Tenga en cuenta que nohup está casi disponible en las variantes Solaris/BSD/Linux/UNIX.,
Cuál es la diferencia entre nohup y ampersand (&)
Both nohup myprocess.out &
or myprocess.out &
set myprocess.salir a correr en el fondo. Después de apagar el terminal, el proceso todavía se está ejecutando. ¿Cuál es la diferencia entre ellos?
nohup
captura la señal de hangup (ver man 7 signal
) mientras que el ampersand No (excepto que el shell se configura de esa manera o no envía SIGHUP
en absoluto).,
normalmente, al ejecutar un comando usando &
y salir del shell después, el shell terminará el sub-comando con la señal hangup (kill -SIGHUP <pid>
). Esto se puede evitar usando nohup
, ya que atrapa la señal y la ignora para que nunca llegue a la aplicación real.
en caso de que esté usando bash, puede usar el comando shopt | grep hupon
para averiguar si su shell envía SIGHUP a sus procesos hijos o no. Si está desactivado, los procesos no terminados, como parece ser el caso para usted., Puede encontrar más información sobre cómo bash termina las aplicaciones aquí.
hay casos en los que nohup
no funciona, por ejemplo, cuando el proceso que inicia vuelve a conectar la señal SIGHUP
, como es el caso aquí.
temas avanzados
trabajos existentes, procesos
algunos shells (por ejemplo, bash) proporcionan un shell integrado que se puede usar para evitar que SIGHUP se envíe o se propague a trabajos existentes, incluso si no se iniciaron con nohup., En bash, esto se puede obtener usando disown -h job
; usando el mismo builtin sin argumentos elimina el trabajo de la tabla de trabajos, lo que también implica que el trabajo no recibirá la señal. Antes de usar disown
en un trabajo activo, debe detenerse con Ctrl-Z
y continuar en segundo plano con el comando bg
. Otra opción bash relevante es shopt huponexit
, que envía automáticamente la señal HUP a los trabajos cuando el shell sale normalmente.,
las versiones AIX y Solaris de nohup tienen una opción -p
que modifica un proceso en ejecución para ignorar futuras señales SIGHUP. A diferencia del anteriordisown
builtin de bash, nohup -p
acepta identificadores de proceso.
superar el bloqueo
tenga en cuenta que nohupping backgrounded jobs se utiliza normalmente para evitar terminarlos al cerrar sesión desde una sesión remota SSH. Un problema diferente que a menudo surge en esta situación es que ssh se niega a cerrar sesión («cuelga»), ya que se niega a perder cualquier dato de/a los trabajos en segundo plano., Este problema también se puede resolver redirigiendo los tres flujos de E/S:
$ nohup ./myprogram > foo.out 2> foo.err < /dev/null &
También tenga en cuenta que una sesión SSH de cierre no siempre envía una señal HUP a los procesos dependientes. Entre otros, esto depende de si un pseudo-terminal fue asignado o no.
alternativas
multiplexor de Terminal
un multiplexor de terminal puede ejecutar un comando en una sesión separada, separada del terminal actual, lo que significa que si la sesión actual termina, la sesión separada y sus procesos asociados se siguen ejecutando. Luego se puede volver a conectar a la sesión más adelante.,
por ejemplo, se ejecutará la siguiente invocación de la pantalla somescript.sh en segundo plano de una sesión separada:
screen -A -m -d -S somename ./somescript.sh &
comando disown
el comando disown se utiliza para eliminar trabajos de la tabla de trabajos o para marcar trabajos de modo que no se envíe una señal SIGHUP al finalizar la sesión.
así es como puede probarlo:
$ pullftp.sh &$ disown -h$ exit
de la página de manual de bash bash(1):
por defecto, elimina cada argumento JOBSPEC de la tabla de trabajos activos., Si se da la opción-h, el trabajo no se elimina de la tabla, sino que se marca para que SIGHUP no se envíe al trabajo si el shell recibe un SIGHUP. La opción – a, cuando no se proporciona JOBSPEC, significa eliminar todos los trabajos de la tabla de trabajos; la opción-r significa eliminar solo los trabajos en ejecución.
comando at
puede usar el comando at para poner en cola un trabajo para su ejecución posterior. Por ejemplo, puede ejecutar pullftp.sh script a cola (un minuto) ejecución posterior:
$ echo "pullftp.sh" | at now + 1 minute