Esta es una pregunta que se ha abordado varias veces, no solo aquí, sino también en otros sitios de la red de intercambio de pila (por ejemplo, ¿Cómo hacer que ssh mate el proceso remoto cuando interrumpo ssh? ). Sin embargo, no puedo hacer que ninguna de las soluciones funcione para mí.
Estoy ejecutando un comando a través de ssh. Cada vez que salgo de ssh, quiero que el comando también muera. Este comando es un demonio llamado ktserver que se ejecuta indefinidamente hasta que presione Ctrl-C.
Lo ejecuto de la siguiente manera: ssh -t compute-0-1 ktserver
y, de hecho, cuando presiono Ctrl-C, el proceso finaliza con gracia y la sesión ssh finaliza.
Sin embargo, si en lugar de presionar Ctrl-C, elimino el proceso ssh usando el kill
comando (por ejemplo, enviando SIGINT o SIGHUP), el ktserver
proceso permanece vivo.
¿Cómo puedo hacer que el ktserver
siempre muera independientemente de cómo ssh
se mata?
EDITAR : si, en lugar de ktserver
ejecutar algo completamente diferente, como gedit
, todo funciona como un encanto (es decir, gedit muere cuando la conexión muere). Por lo tanto, puede haber algo mal con el proceso en sí. Por ejemplo, pensé que podría estar ignorando SIGHUP o SIGINT. Sin embargo, cuando ejecuto kill -1 ktserver
o kill -2 ktserver
, el proceso muere como se esperaba.
EDIT2 : Como señala Mark Plotnick, el problema está relacionado con el hecho de que no hay comunicación circulando en el canal ssh. Lo he confirmado ejecutando ssh -t <host> read
y matando el proceso ssh después. read
seguía vivo y pateando.
kill -9 ktserver
?ssh example.com dd ...
completado los trabajos incluso horas después de que lassh
conexión falle debido a problemas de red. Si puede modificarktserver
para tomar una opción para generar algo de vez en cuando, eso puede ser una solución.read
en la computadora remota, y después de cerrar la conexión ssh,read
no morí. Desafortunadamente, no puedo cambiar ktserver para generar nada. ¿No hay solución entonces?shopt -s huponexit
) ¿Puedes probar si esto funciona para ti?Respuestas:
Por lo general, cuando la conexión ssh muere, el shell también muere. Puede configurar su shell para enviar una señal -1 (SIGHUP) cuando termina a todos sus hijos.
Para bash, puede configurar esta opción a través del comando incorporado shopt . (
shopt -s huponexit
)Por zsh que quieras .
setopt
HUP
fuente
ssh -t -t
, (¡aviso-t
dos veces!) Lo que fuerza la asignación de tty, en lugar de solo pty.Encontré eso simplemente usando
-t -t
como argumento parassh
hacerlo funcionar. No tuve que configurarhuponexit
ni el shell de origen ni el remoto.Probé esto de la siguiente manera:
No funciona
Esto mató la sesión ssh, pero puedo ver que el proceso de suspensión aún se está ejecutando en el host remoto (lo
ps -ef | grep sleep
muestra).Funciona:
Esto mata la sesión ssh y también se eliminó el proceso de suspensión remota. También he verificado que la señal que se envía al proceso remoto es
SIGINT
si usa Control- C. También verifiqué que SIGKILL (-9) aplicado alssh
proceso también eliminará el proceso remoto.EDITAR 1:
Eso fue cierto para
sleep
... para procesos remotos más obstinados, descubrí quessh
maneja ^ C de manera diferente que SIGINT. Ctrl- Cfuncionó, pero no lokill -INT $pid
hizo.Esto es lo que finalmente se me ocurrió que funcionó para mi aplicación real (robando de las otras respuestas).
Tenga en cuenta el uso anidado de comillas dobles y comillas simples. ¡Tenga en cuenta que su proceso remoto DEBE responder a SIGHUP saliendo realmente!
fuente
cat
. Por ejemplo,ssh -ttq user@host '{ cmd; cmd; } | cat'
Ctrl-C
NO siempre es equivalente akill -INT $pid
, vea mi respuesta en unix.stackexchange.com/questions/377191/… y otra en stackoverflow.com/questions/8398845/… para los detalles sangrientos ;-)^C
envía SIGINT . Entonces, ¿cuál es la diferencia exacta si no son equivalentes?Si ssh no propaga señales, recibe ¿qué esperarías de él?
UPD (especial para JosephR): obviamente es un error en cuestión que se deriva de un malentendido: "El proceso de eliminación se genera por ssh cuando ssh muere". SSH generalmente no genera procesos (a veces lo hace, pero esta es otra historia), SSHD sí lo hace, cuando miramos el otro lado de la conexión. SSH simplemente se basa en la abstracción pseudo-terminal que tiene el servidor remoto. Es por eso que lo único que puede ser de ayuda es la capacidad del terminal para emitir señales a sus procesos adjuntos. Esto es algo muy básico para todos los sistemas tipo UNIX.
fuente
La solución publicada aquí no funcionó para mí, pero como esta pregunta surgió primero cuando estaba buscando una solución a un problema similar y también
-t -t
se mencionó el truco aquí, publicaré una solución que funcionó para mí para que otros la intenten.Mi comando de larga ejecución ya no se estaba ejecutando cuando la conexión se terminó así.
fuente