Antworten:
Nein, der richtige Weg zu töten autosshist einfach, den Prozess zu töten autossh, sonst nichts.
Der Grund ist
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
Das autosshist einfach ein Shell-Skript, kein Dienst . Es startet ein neues Programm, in seiner allerletzten Zeile,
exec /usr/lib/autossh/autossh "$@"
wieder kein service. Was exec(Sie können es im Wiki der Bash-Hacker noch einmal überprüfen ) betrifft, so handelt es sich um einen Shell-eingebauten Befehl, der die aktuelle Shell durch den folgenden Befehl ersetzt ( /usr/lib/autossh/autossh "$@"in diesem Fall), ohne einen neuen Prozess zu starten. Die einzige Möglichkeit, dies zu stoppen, autosshbesteht beispielsweise darin, das aufrufende Skript zu beenden
pkill -3 autossh
( Vielen Dank an dviljoen, der darauf hingewiesen hat, wie wichtig es ist, das Flag -3 zu verwenden, siehe unten). Im Übrigen sshfunktioniert das Beenden der Verbindung nicht, da der aufrufende Befehl ( dh der oben genannte) einfach eine neue Verbindung startet, sobald er feststellt, dass die alte Verbindung getrennt wurde.
SIGTERMist die Standardeinstellung und diese ist 15. SIGQUITist 3, siehe superuser.com/questions/352147/what-does-kill-3-mean und en.wikipedia.org/wiki/Kill_(command) - Auch FWIW, ich habe gerade überprüft und -15nicht herunter es nicht nach unten, so SIGTERMkann nicht verwendet werden.
pkillohne Signal (= das default) endet auch nicht autossh.
starte auto ssh mit:
AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh
töte es mit:
kill pid
BTW
pkill -9 autossh ist falsch
-9Stellt sicher, dass der Prozess nicht ordnungsgemäß beendet wird, sodass der Prozess nach dem Beenden sshimmer noch vorhanden autosshist
Ohne -9ist es immer noch schlimm, wenn Sie mehrere Tunnel laufen haben, pkillwerden sie alle töten
richtige weise ist es AUTOSSH_PIDFILEenv var dann nur killdiese pid zu setzen
Ich weiß, dass dies beantwortet wurde, aber im Gegensatz zu den obigen Kommentaren werden pkill -3 autosshdie untergeordneten sshd-Prozesse für mich durch die Verwendung von NICHT beendet.
Ich benutze diese Funktion in meiner .bashrcDatei.
Im Grunde ist es so, als würde --killman autossh ein Argument hinzufügen.
if [ "$1" = "--kill" ]; then
ps aux |
grep -P "(/usr/bin/ssh|/usr/lib/autossh/autossh)\s.*$2" |
awk '{print $2}' |
xargs -r kill
else
$(which autossh) "$@"
echo "" # prevents line wrapping when you kill the ssh process
fi
Sie können die Pfade auf Ihrem System ausführen which sshund which autosshüberprüfen.
Solange das erste Argument nicht --killzutrifft, werden die Argumente nur an autossh weitergegeben.
Dieses Skript beendet die autossh & ssh-Instanzen. Dies ist wichtig, wenn Sie die Portweiterleitung verwenden, da NUR durch das Beenden der autossh-Instanz der Tunnel nicht beendet wird, sondern nur verhindert wird, dass die Verbindung wiederhergestellt wird, wenn die Verbindung endgültig getrennt wird.
Sie können auch einen Suchbegriff (Hostname) angeben, um nur bestimmte Tunnel zu beenden.
autossh --kill dbserver1tötet nur die Verbindungen zu dbserver1
autossh --kill dbserverdbserver1 töten, dbserver2 usw.
autossh --kill dbservertötet alle autossh Verbindungen
Zur Verdeutlichung SOLLTE es nur die von autossh gestarteten SSH-Sitzungen beenden.
Wenn Sie ausführen, ps aux | grep sshwährend sowohl autossh- als auch ssh-Sitzungen ausgeführt werden, werden Sie feststellen, dass diejenigen, die mit autossh gestartet wurden, den vollständigen Pfad verwenden (/ usr / bin / ssh und / usr / lib / autossh / autossh).
Dieses Skript vergleicht nur Ergebnisse mit Prozessen, die mit dem Pfad "speicifc" gestartet wurden. Ich habe dies getan, weil ich (und ich nehme an, die meisten Leute) normalerweise tippe sshund nicht den vollständigen Pfad, wodurch verhindert wird, dass meine normalen SSH-Sitzungen beendet werden.
Hoffe das hilft anderen.
$(which autossh)statt einfach autossh?