Je lance un script distant via SSH comme ceci:
ssh user@ipaddress '~/my_script.sh'
Tout va 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 comment je pourrais 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
Lorsque je le lance via SSH, il s'exécute et à la fin, je lis "Tout est fait". cela signifie donc qu'il atteint les 2 dernières lignes .
Toute idée que je pourrais faire pour fermer automatiquement et pr
bash
ssh
shell-script
Olivier Pons
la source
la source
~/.ssh/config
, essayez sans et passez les options-a -x
(et non-o
)ssh
pour vous assurer qu'il n'y a pas de transfert en cours. Si cela ne fonctionne toujours pas, affichez le contenu du script.ssh <yourusername>@localhost '(ls; sleep 10 &); echo Done; jobs'
listera les fichiers, affichera terminé et attendra 10 secondes avant de revenir.Réponses:
La sortie dans le script shell ne fonctionne pas car elle quitte le script, pas le shell. Pour quitter le shell une fois le script terminé, faites
Cela exécutera le script puis quittera le shell.
la source
sshd
le shell et son exécutionmyscript.sh
. Celui queexit
vous avez écrit agira à la fin du script, ce qui n'aide pas. La seule façon dont votre solution pourrait fonctionner est si le script fait quelque chose de bizarre lorsque son parent estsshd
et ne fait pas cette chose bizarre lorsque son parent est un shell.~/my_script.sh && exit
quitte dès que se termine~/my_script.sh
. Si le script shell ne se terminait pas, votre commande ne parviendrait jamais auexit
bit de toute façon. Donc c'est juste inutile.La connexion ssh reste ouverte lorsque le processus démarré par ssh (ici, un shell) se termine, si d'autres processus l'utilisent encore. Je ne connais pas les règles exactes que le démon ssh suit, mais une connexion est en cours d'utilisation, au moins, si la sortie standard de tout processus enfant est toujours connectée au canal d'origine fourni par ssh. Comparer:
Lorsque vous démarrez un démon, vous devez le mettre en arrière-plan et fermer ses descripteurs de fichiers. Utilisez au moins ceci:
Vous voudrez peut-être ajouter
nohup
à l'avant; cela ne fera aucune différence ici mais serait utile si le script était exécuté à partir d'un terminal. De nombreux programmes conçus pour agir en tant que démon ont des options de ligne de commande pour les amener à bifurquer, fermer les descripteurs de fichiers, ignorer les signaux et autres subtilités. Vérifiez dans laqaswvd
documentation si elle en a un. Vous pouvez également enquêter sur les utilitaires «daemonizer».la source
J'ai vu ce message lorsque j'ai recherché la solution de la même situation sur Google. Bien qu'il soit un peu tard pour résoudre le problème de @ Oliver, puisque la réponse acceptée ne fonctionnait clairement ni pour OP ni pour moi (je ne sais pas pourquoi elle est acceptée), je voudrais quand même publier ma propre solution pour le futur googleur. C'est simple: ajoutez une
-f
option dans lassh
commande:ÉDITER
L'effet de l'
-f
option est de mettressh
en arrière-plan, donc sans autre option ajoutée, il est possible que la connexion soit toujours en vie même si elle semble rompue. On peut se référer à la réponse donnée dans un autre post sur ce site si vous êtes intéressé.la source
Comme Ignacio, je suis curieux de savoir ce qu'il y a dans votre script.
Peut-être pourriez-vous essayer de réduire votre script au plus petit exemple possible qui génère 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, puis vous saurez 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 .bash_logout ou un tel appelé à la sortie qui peut provoquer un problème?
la source
Vous pouvez probablement utiliser des travaux dans votre script. Si tel est le cas, le shell attend que vos travaux soient terminés et ne souhaite pas se détacher.
Je ne vais pas republier, je vous ferai simplement parvenir http://en.wikipedia.org/wiki/Nohup#Existing_jobs
la source
nohup
n'est pas directement le problème ici car il n'y a pas de terminal côté serveur: je pense que le coupable est spécifiquement le descripteur de fichier ouvert.Vous devrez tuer votre processus parent depuis votre script.
kill -SIGHUP $PPID
la source
Le problème est probablement la ligne suivante.
Cette commande est probablement toujours en cours d'exécution et gardera le tuyau ssh ouvert jusqu'à ce que stdin et stdout & stderr soient fermés.
Utilisez-le à la place:
la source