¿Cómo pongo un proceso que ya se está ejecutando en nohup?
Tengo un proceso que ya lleva mucho tiempo ejecutándose y no quiero finalizarlo.
¿Cómo lo pongo en nohup (es decir, cómo hago para que continúe ejecutándose incluso si cierro la terminal?)
Usando el control de trabajo de bash para enviar el proceso a segundo plano:
- Ctrl+ Zpara detener (pausar) el programa y volver al shell.
bg
para ejecutarlo en segundo plano.disown -h [job-spec]
donde [especificación de trabajo] es el número de trabajo (como%1
para el primer trabajo en ejecución; busque su número con eljobs
comando) para que el trabajo no finalice cuando se cierre la terminal.
Supongamos que por alguna razón Ctrl+ Ztampoco funciona, vaya a otra terminal, busque la identificación del proceso (usando ps
) y ejecute:
kill -SIGSTOP PID
kill -SIGCONT PID
SIGSTOP
suspenderá el proceso y SIGCONT
lo reanudará, en segundo plano. Entonces, cerrar ambas terminales no detendrá el proceso.
El comando para separar un trabajo en ejecución del shell ( = lo convierte en nohup) es disown
un comando básico del shell.
Desde bash-manpage (man bash):
repudiar [-ar] [-h] [especificación de trabajo ...]
Sin opciones, cada especificación de trabajo se elimina de la tabla de trabajos activos. Si se proporciona la opción -h, cada especificación de trabajo no se elimina de la tabla, pero se marca para que SIGHUP no se envíe al trabajo si el shell recibe un SIGHUP. Si no hay ninguna especificación de trabajo presente y no se proporcionan las opciones -a ni -r, se utiliza el trabajo actual. Si no se proporciona ninguna especificación de trabajo, la opción -a significa eliminar o marcar todos los trabajos; la opción -r sin un argumento de especificación de trabajo restringe la operación a trabajos en ejecución. El valor de retorno es 0 a menos que una especificación de trabajo no especifique un trabajo válido.
Eso significa que un simple
disown -a
eliminará todos los trabajos de la tabla de trabajos y los desactivará