Publiqué la ^z; bg; disown
secuencia para permitirme cerrar una sesión ssh en la que estoy ejecutando un proceso super importante de larga duración. Este proceso escribe la salida de estado en stderr, y ha continuado haciéndolo incluso después de ser desconectado (verificado con lsof, el stderr fd está abierto para r / w).
¿Hay alguna manera de determinar que el proceso ha sido desautorizado (no recibirá SIGHUP si el shell recibe uno)?
Respuestas:
En Bash, el
disown
comando emitido por sí mismo eliminará los procesos en segundo plano (a través debg
o&
) de la tabla de trabajo activa y los marcará para no recibir un SIGHUP al cerrar sesión.También puede pasar uno o más trabajos a rechazar, como
disown 1 3
. Eldisown -h
indicador es útil si desea mantener los trabajos en la tabla, pero aún no SIGHUP al cerrar sesión.Puede ver la tabla de trabajos emitiendo el
jobs
comando. Después de un fondo exitoso, se mostrará[1]+ command &
. Después de rechazar un trabajo, ya no debería mostrarse en la tabla de trabajos, y ya no debería desaparecer al cerrar sesión. Todavía se puede ver el proceso a travésps ux
,top
y otros servicios de proceso de visualización.Después de que un trabajo ha sido rechazado, puede esperar a que termine naturalmente o enviar una señal
kill
al PID para detenerlo.Debido a que Bash solo está eliminando el trabajo de la lista de trabajos en ejecución para finalizar y los identificadores de archivo para stdout y stderr de su terminal aún están abiertos, continuará recibiendo la salida del trabajo hasta que su dispositivo terminal se cierre (cuando cierre la sesión) .
Ejemplos:
Por lo general, solo lo uso
disown
si ejecuto un comando potencialmente de ejecución prolongada como unrsync
oycp
luego decido que necesito cerrar sesión sin terminarlo. Si sabe que va a ejecutar un comando y cerrar la sesión, puede capturar la salida canalizándolatee
a un archivo, ejecutándolanohup
o ejecutándolascreen
(lo que le permite retomar la propiedad del comando / finalizar después) )Ejemplos:
fuente
detach
en un trabajo en segundo plano, se separará :) no hay realmente un término medio allí donde ejecutarlo en un proceso en segundo plano no hará nada. la verificaciónjobs
solo verifica que no intentaste separar un proceso detenido o algo así.