Estoy lanzando un script distante a través de SSH como este:
ssh user@ipaddress '~/my_script.sh'
Todo va bien, pero una vez que finaliza el script, la conexión no se cierra. Tengo que presionar CTRL-C para romper la conexión actual.
He intentado el comando "salir" en '~ / my_script.sh' y es inútil. He probado el comando "cerrar sesión" en '~ / my_script.sh' y recibo un mensaje:
logout: not login shell: use exit
...
¿Alguna idea de cómo podría hacer para cerrar automáticamente y correctamente el SSH una vez que se haya completado el script?
(Modificación para aclarar :) Esto es lo que hay dentro de mi script:
#!/bin/sh
path_sources_qas=/sources/QuickAddress/
path_qas_bin=/usr/bin/qas
umount_disque_qas()
{
# Umount du disque 'qas' s'il n'avait pas été 'umount' :
nom_disque_monte=`cat /etc/mtab | grep qas | awk '{ print $2}'`
if [ "$nom_disque_monte" != "" ]
then
echo "For safety, umount : $nom_disque_monte"
umount $nom_disque_monte
fi
}
# Umount twice (we never know if a st***d guy mounted it twice) :
umount_disque_qas
umount_disque_qas
echo "--------------------------------"
echo "Install ISO quick address..."
nom_fichier_iso=`ls -t $path_sources_qas | awk '{if (NR==1) {print $1}}'`
echo "Mount disk $nom_fichier_iso..."
mount -o loop -t iso9660 $path_sources_qas/$nom_fichier_iso /mnt/qas
echo "Done."
# All the folders are like this :
# /usr/bin/qas/Data.old.10
# /usr/bin/qas/Data.old.11
# /usr/bin/qas/Data.old.12
# ...
echo "--------------------------------"
echo "Stopping QuickAdress server..."
cd $path_qas_bin/apps/
./wvmgmtd shutdown qaserver:2021
sleep 3
echo "Done."
# Get last number of the folder:
num_dernier_dossier_backup=`ls -Atd $path_qas_bin/Data.old* | awk '{if (NR==1) {print $1}}' | awk -F . '{print $NF}'`
# Add 1 :
let "num_dernier_dossier_backup += 1"
# Full name :
nom_dossier_backup=Data.old.$num_dernier_dossier_backup
echo "--------------------------------"
echo "Saving Data to $nom_dossier_backup..."
cd $path_qas_bin
mv Data $nom_dossier_backup
echo "Done."
echo "--------------------------------"
echo "Copying new folder Data..."
cd $path_qas_bin
cp -r /mnt/qas/Data .
echo "Done."
echo "--------------------------------"
echo "Deleting unused datas..."
cd $path_qas_bin/apps/
rm -f $path_qas_bin/Data/frxmos.dap
echo "Done."
echo "--------------------------------"
echo "Restart server..."
cd $path_qas_bin/apps/
./qaswvd &
sleep 3
echo "Done."
sleep 3
echo "--------------------------------"
echo "Check: server state: you should read 'OK':"
./wvmgmtd srvlist
echo "Done."
echo "--------------------------------"
echo "Check: active licences (only one here):"
./wvmgmtd licencelistread qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Check: counters: number of addresses left:"
./wvmgmtd counterinforead qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Check: Datasets avalaibles:"
./wvmgmtd datalistread current qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Check: "meters" for "licence by click":"
./wvmgmtd meterslistread current qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Removing virtual disk..."
umount_disque_qas
echo "Done."
echo "All done"
echo "Click 'Ctrl-C' to quit."
exit
Cuando lo ejecuto a través de SSH, se ejecuta y, al final, leo "Todo listo". Esto significa que llega a las últimas 2 líneas .
Alguna idea de cómo podría hacer para cerrar automáticamente y pr
bash
ssh
shell-script
Olivier Pons
fuente
fuente
~/.ssh/config
, intente sin él y pase las opciones-a -x
(y no-o
)ssh
para asegurarse de que no haya reenvío. Si aún no funciona, muestre el contenido del guión.ssh <yourusername>@localhost '(ls; sleep 10 &); echo Done; jobs'
mostrará una lista de archivos, la pantalla estará lista y esperará 10 segundos antes de regresar.Respuestas:
La salida en el script de shell no funciona porque está saliendo del script, no del shell. Para salir del shell después de que se complete el script, haga
Esto ejecutará el script y luego saldrá del shell.
fuente
sshd
y el shell en ejecuciónmyscript.sh
. Loexit
que escribiste actuará cuando salga el guión, lo que no ayuda. La única forma en que su solución podría funcionar es si el script hace algo extraño cuando su padre essshd
y no hace algo extraño cuando su padre es un shell.~/my_script.sh && exit
sale tan pronto como~/my_script.sh
sale. Si el script de shell no se cierra, su comando nunca llegará alexit
bit de todos modos. Entonces es inútil.La conexión ssh permanece abierta cuando sale el proceso iniciado por ssh (aquí, un shell), si hay otros procesos que todavía lo están utilizando. No sé las reglas exactas que sigue el demonio ssh, pero se está utilizando una conexión, al menos, si la salida estándar de cualquier proceso secundario todavía está conectada a la tubería original proporcionada por ssh. Comparar:
Cuando comienzas un demonio, debes ponerlo en segundo plano y cerrar sus descriptores de archivo. Al menos, usa esto:
Es posible que desee agregar
nohup
al frente; aquí no hará la diferencia, pero sería útil si el script se ejecutara desde un terminal. Muchos programas que están diseñados para actuar como daemon tienen opciones de línea de comandos para hacer que se bifurquen, cierren los descriptores de archivos, ignoren las señales y otros detalles. Consulte en laqaswvd
documentación si tiene uno. También puede investigar las utilidades de "daemonizer".fuente
Vi esta publicación cuando busqué en Google la solución de la misma situación. Aunque es un poco tarde para resolver el problema de @ Oliver, ya que la respuesta aceptada claramente no funcionó ni para OP ni para mí (no sé por qué se acepta), todavía me gustaría publicar mi propia solución para el futuro buscador de Google. Es simple: agregue una
-f
opción alssh
comando:EDITAR
El efecto de la
-f
opción es ponerlossh
en segundo plano, por lo que sin agregar ninguna otra opción, es posible que la conexión siga viva incluso si parece que está rota. Uno puede referirse a la respuesta dada en otra publicación en este sitio si está interesado.fuente
Como Ignacio, tengo curiosidad por saber qué hay en tu guión.
Quizás podría intentar reducir su script al ejemplo más pequeño posible que produzca la condición de error.
O comience desde un script vacío y agregue un comando a la vez hasta que vea el problema, entonces sabrá qué comando hace que su script se bloquee.
Si la secuencia de comandos vacía le causa un problema, es posible que desee investigar su configuración de ssh, por ejemplo, ¿es .bash_logout o alguno de los llamados a la salida que puede causar un problema?
fuente
Probablemente pueda usar trabajos en su script. Si ese es el caso, Shell solo espera a que finalicen sus trabajos y no quiere separarse.
No voy a volver a publicar, solo te reenviaré http://en.wikipedia.org/wiki/Nohup#Existing_jobs
fuente
nohup
no es directamente el problema aquí, ya que no hay terminal en el lado del servidor: creo que el culpable es específicamente el descriptor de archivo abierto.Necesitarás eliminar tu proceso padre desde tu script.
kill -SIGHUP $PPID
fuente
El problema es probablemente la siguiente línea.
Este comando probablemente todavía se esté ejecutando y mantendrá la tubería ssh abierta hasta que stdin y stdout & stderr estén cerrados.
Use esto en su lugar:
fuente