Estoy ejecutando el siguiente comando y monitoreando el archivo de salida en el otro sistema:
ssh $ip_address 'for n in 1 2 3 4 5; do sleep 10; echo $n >>/tmp/count; done'
Si elimino el comando ssh usando ^C
o simplemente eliminando el terminal en el que he iniciado sesión, esperaría que el comando remoto también finalice. Sin embargo, esto no sucede: /tmp/count
obtiene todos los números del 1 al 5 independientemente y ps -ejH
muestra que el shell y su sleep
hijo continúan ejecutándose.
¿Es este comportamiento esperado y está documentado en alguna parte? ¿Puedo desactivarlo? Después de leer, esperaba tener que habilitar explícitamente este tipo de comportamiento con nohup, no para que sea el predeterminado.
He echado un vistazo a las páginas de manual de ssh y sshd, pero no vi nada obvio, y Google me señala las instrucciones para activar este comportamiento, no para desactivarlo.
Estoy ejecutando Red Hat Enterprise Linux 6.2, con un inicio de sesión raíz y bash shell en ambos sistemas.
-tt
lugar de-t
si ssh no tiene un tty asignado. SSH no obtendrá un tty asignado si ssh se pone en segundo plano inmediatamente después de la invocación mediante opciones como-f
o-n
.Intente asignar un psuedo-tty con su
ssh
comando.ssh -t $ip_address 'for n in 1 2 3 4 5; do sleep 10; echo $n >>/tmp/count; done'
Cuando desconecta la sesión ssh, el proceso debería finalizar.
Como se trata de una pseudo-tty, su inicialización de shell probablemente no vaya a los archivos de configuración de origen, dejando su comando con un entorno muy simple. Es posible que deba configurar un
.ssh/environment
archivo que defina variables de entorno como PATH. Desdeman 1 ssh
fuente
Como alternativa al uso de la
-t
opción parassh
hacer que el comando remoto termine cuando elssh
cliente sale o (se mata), se puede usar una tubería con nombre para convertir "EOF a SIGHUP" cuandosshd
se cierra el stdin de (ver Bug 396 - sshd los huérfanos procesan cuando no se asigna pty ).fuente
Esta es la mejor manera que he encontrado para hacer esto. Desea algo en el lado del servidor que intente leer stdin y luego mata al grupo de procesos cuando eso falla, pero también desea un stdin en el lado del cliente que se bloquee hasta que se complete el proceso del lado del servidor y no deje procesos persistentes como <( dormir infinito) poder.
En realidad, no parece redirigir stdout a ninguna parte, pero funciona como una entrada de bloqueo y evita capturar pulsaciones de teclas.
Error relevante de openssh: https://bugzilla.mindrot.org/show_bug.cgi?id=396#c14
fuente
Si desea deshabilitar eso (aparentemente comportamiento predeterminado), debe habilitar ssh-keep-alive en el lado del cliente o del servidor.
Si observa las opciones ssh-keep-alive-en las páginas de manual, puede ver que están deshabilitadas de forma predeterminada.
fuente
Mi respuesta se basa en teru. Necesito un script de ayuda
~/helper
en el servidor server.ip:Si se llama, por ejemplo, con
y se ejecuta
echo hello from server
en server.ip, y luego el cliente ssh terminará.Si se llama, por ejemplo, con
kill -9 $CHID
también detendrá el script en el servidor. Para mí,kill -INT $CHID
no funciona, pero no sé por qué.En la respuesta de teru, el comando ssh esperará para siempre cuando termine el comando remoto, porque
cat
nunca termina.Todas las respuestas con ssh -t no funcionaron para mí
kill
, sino solo con Ctrl-C.Editar: descubrí que esto funcionó desde un nuevo Ubuntu 14.01 a una caja de linux científica más antigua, pero no al revés. Por lo tanto, creo que no hay una solución general. Extraño.
fuente