web-dev-qa-db-fra.com

SSH et Shell à travers SSH: comment sortir?

Je lance un script distant via SSH comme ceci:

ssh user@ipaddress '~/my_script.sh'

Tout se passe bien, mais une fois le script terminé, la connexion n'est pas fermée. Je dois appuyer sur CTRL-C pour rompre la connexion actuelle.

J'ai essayé la commande "exit" dans '~/my_script.sh' et c'est inutile. J'ai essayé la commande "logout" dans '~/my_script.sh' et je reçois un message:

logout: not login Shell: use exit

...

Une idée de ce que je pourrais faire pour fermer automatiquement et correctement le SSH une fois le script terminé?

(Modification pour clarification :) Voici ce qu'il y a dans mon 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

Quand je le lance par SSH, il tourne et à la fin, je lis "Tout est fait." donc cela signifie atteint les 2 dernières lignes .

Toute idée de ce que je pourrais faire pour fermer

20
Olivier Pons

L'exit dans le script Shell ne fonctionne pas car il s'agit d'un script, pas du Shell. Pour quitter le shell une fois le script terminé, faites-le.

ssh user@ipaddress '~/my_script.sh && exit'

Cela va exécuter le script puis quitter le shell.

18
Wuffers

La connexion ssh reste ouverte à la fermeture du processus démarré par ssh (ici un shell), si d'autres processus l'utilisent encore. Je ne connais pas les règles exactes suivies par le démon ssh, mais une connexion est utilisée, du moins, si la sortie standard de tout processus enfant est toujours connectée au canal d'origine fourni par ssh. Comparer:

ssh somehost 'sleep 5 &'  # exits after 5 seconds
ssh somehost 'sleep 5 >/dev/null &'  # exits immediately seconds

Lorsque vous démarrez un démon, vous devez l’arrière-plan et fermer ses descripteurs de fichier. Au moins, utilisez ceci:

./qaswvd </dev/null >/dev/null 2>/dev/null &

Vous voudrez peut-être ajouter Nohup devant; cela ne fera aucune différence ici mais serait utile si le script était exécuté depuis un terminal. De nombreux programmes conçus pour agir en tant que démon ont une option de ligne de commande pour les amener à bifurquer, à fermer les descripteurs de fichier, à ignorer les signaux et autres subtilités. Vérifiez la documentation qaswvd si elle en a une. Vous pouvez également rechercher des utilitaires "démoniseur".

12
Gilles

J'ai vu ce post quand j'ai cherché sur Google pour la solution de la même situation. Bien qu'il soit un peu tard pour résoudre le problème de @ Oliver, étant donné que la réponse acceptée ne fonctionnait clairement ni pour OP, ni pour moi (je ne sais pas pourquoi, elle est acceptée), j'aimerais quand même publier ma propre solution pour le futur googler. C'est simple: ajoutez une option -f dans la commande ssh:

ssh -f user@ipaddress '~/my_script.sh'

MODIFIER

L'effet de l'option -f est de mettre ssh à l'arrière-plan. Par conséquent, sans aucune option supplémentaire, il est possible que la connexion soit toujours active même s'il semble qu'elle soit interrompue. On peut se référer à la réponse donnée dans un autre message sur ce site si cela vous intéresse.

5
Leo Fang

Comme Ignacio, je suis curieux de savoir ce que contient votre script.

Vous pourriez peut-être essayer de réduire votre script au plus petit exemple possible qui produit la condition d'erreur.

Ou commencez à partir d'un script vide et ajoutez une commande à la fois jusqu'à ce que vous voyiez le problème. Vous saurez alors quelle commande provoque le verrouillage de votre script.

Si le script vide vous pose un problème, vous voudrez peut-être examiner votre configuration SSH. Par exemple, est-ce que .bash_logout ou un autre de ces appels appelés à la sortie pourrait causer un problème?

3
asoundmove

Vous pouvez probablement utiliser des emplois dans votre script. Si tel est le cas, Shell attend simplement que vos travaux soient terminés et ne souhaite pas se détacher.

Je ne vais pas vous republier, je vous ferai simplement parvenir http://en.wikipedia.org/wiki/Nohup#Existing_jobs

2
Oleksiy Khilkevich

Vous allez avoir besoin de tuer votre processus parent depuis votre script.

kill -SIGHUP $PPID

1
OmnipotentEntity

Le problème est probablement la ligne suivante.

./qaswvd &

Cette commande est probablement toujours en cours d'exécution et maintiendra le tube ssh ouvert jusqu'à la fermeture de stdin et stdout & stderr.

Utilisez ceci à la place:

./qaswvd </dev/null >/dev/null 2>&1 &
0
edirks