Ich starte ein entferntes Skript über SSH wie folgt:
ssh user@ipaddress '~/my_script.sh'
Alles läuft gut, aber sobald das Skript beendet ist, wird die Verbindung nicht geschlossen. Ich muss STRG-C drücken, um die aktuelle Verbindung zu trennen.
Ich habe den Befehl "exit" in "~ / my_script.sh" ausprobiert und er ist unbrauchbar. Ich habe den Befehl "logout" in "~ / my_script.sh" ausprobiert und erhalte folgende Meldung:
logout: not login shell: use exit
...
Irgendeine Idee, wie ich das SSH automatisch und richtig schließen könnte, wenn das Skript fertig ist?
(Änderung zur Verdeutlichung :) Folgendes ist in meinem Skript enthalten:
#!/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
Wenn ich es über SSH starte, läuft es und am Ende lese ich "Alles erledigt". Das bedeutet also, dass es die letzten 2 Zeilen erreicht .
Irgendeine Idee, wie ich es machen könnte, automatisch zu schließen und pr
quelle
~/.ssh/config
, versuchen Sie es ohne diese und übergeben Sie die Optionen-a -x
(und nein-o
) anssh
, um sicherzustellen, dass keine Weiterleitung stattfindet. Wenn es immer noch nicht funktioniert, zeigen Sie den Inhalt des Skripts an.ssh <yourusername>@localhost '(ls; sleep 10 &); echo Done; jobs'
listet Dateien auf, zeigt sie fertig an und wartet 10 Sekunden, bevor sie zurückkehrt.Antworten:
Der Exit im Shell-Skript funktioniert nicht, da das Skript und nicht die Shell beendet werden. Um die Shell nach Beendigung des Skripts zu verlassen, gehen Sie wie folgt vor
Dadurch wird das Skript ausgeführt und die Shell beendet.
quelle
sshd
und der ausgeführten Shell vorhanden sein mussmyscript.sh
. Das, wasexit
Sie geschrieben haben, wird beim Beenden des Skripts ausgeführt, was nicht hilft. Die einzige Möglichkeit, wie Ihre Lösung funktionieren könnte, besteht darin, dass das Skript etwas Seltsamessshd
ausführt, wenn das übergeordnete Element eine Shell ist, und dies nicht, wenn das übergeordnete Element eine Shell ist.~/my_script.sh && exit
sofort beendet~/my_script.sh
. Wenn das Shell-Skript nicht beendet würde, würde Ihr Befehlexit
sowieso nie auf das Bit zugreifen. Also ist es einfach nutzlos.Die ssh-Verbindung bleibt geöffnet, wenn der von ssh (hier eine Shell) gestartete Prozess beendet wird, sofern andere Prozesse ihn noch verwenden. Ich kenne die genauen Regeln, denen der ssh-Daemon folgt, nicht, aber es wird eine Verbindung verwendet, zumindest wenn die Standardausgabe eines untergeordneten Prozesses noch mit der von ssh bereitgestellten ursprünglichen Pipe verbunden ist. Vergleichen Sie:
Wenn Sie einen Daemon starten, sollten Sie ihn im Hintergrund ausführen und seine Dateideskriptoren schließen. Zumindest benutze dies:
Möglicherweise möchten Sie vor hinzufügen
nohup
; Hier macht es keinen Unterschied, aber es wäre nützlich, wenn das Skript von einem Terminal aus ausgeführt würde. Viele Programme, die als Daemon fungieren sollen, verfügen über Befehlszeilenoptionen, mit denen sie verzweigt werden können, Dateideskriptoren schließen, Signale ignorieren und andere Vorteile erzielen können. Überprüfen Sie in derqaswvd
Dokumentation, ob es eine hat. Sie können auch die Dienstprogramme "Daemonizer" untersuchen.quelle
Ich habe diesen Beitrag gesehen, als ich nach der Lösung der gleichen Situation gegoogelt habe. Obwohl es ein bisschen spät ist, das Problem von @ Oliver zu lösen, da die akzeptierte Antwort weder für OP noch für mich funktioniert hat (ich weiß nicht, warum sie akzeptiert wird), möchte ich dennoch meine eigene Lösung für den zukünftigen Googler veröffentlichen. Es ist ganz einfach: Fügen Sie dem Befehl eine
-f
Option hinzussh
:BEARBEITEN
Die Auswirkung der
-f
Option ist, dass siessh
in den Hintergrund gestellt wird. Ohne weitere hinzugefügte Option ist es möglich, dass die Verbindung noch besteht, auch wenn es den Anschein hat, dass sie unterbrochen ist. Bei Interesse kann auf die Antwort in einem anderen Beitrag auf dieser Website verwiesen werden.quelle
Wie Ignacio bin ich neugierig, was in deinem Drehbuch steht.
Vielleicht könnten Sie versuchen, Ihr Skript auf das kleinstmögliche Beispiel zu reduzieren, das die Fehlerbedingung erzeugt.
Oder beginnen Sie mit einem leeren Skript und fügen Sie jeweils einen Befehl hinzu, bis Sie das Problem sehen. Dann wissen Sie, durch welchen Befehl Ihr Skript abstürzt.
Wenn das leere Skript ein Problem verursacht, möchten Sie möglicherweise Ihre ssh-Konfiguration untersuchen. Ist beispielsweise .bash_logout oder ein solcher Aufruf beim Beenden ein Problem?
quelle
Möglicherweise verwenden Sie Jobs in Ihrem Skript. In diesem Fall wartet die Shell nur darauf, dass Ihre Aufträge abgeschlossen sind, und möchte sich nicht von selbst lösen.
Ich werde nicht erneut posten, sondern Sie einfach weiterleiten http://en.wikipedia.org/wiki/Nohup#Existing_jobs
quelle
nohup
hier nicht direkt das Problem, da es auf der Serverseite kein Terminal gibt: Ich denke, der Schuldige ist speziell der offene Dateideskriptor.Sie müssen den übergeordneten Prozess in Ihrem Skript beenden.
kill -SIGHUP $PPID
quelle
Das Problem ist wahrscheinlich die folgende Zeile.
Dieser Befehl wird wahrscheinlich noch ausgeführt und hält die SSH-Pipe offen, bis stdin und stdout & stderr geschlossen werden.
Verwenden Sie dies stattdessen:
quelle