Antworten:
Nein, der richtige Weg zu töten autossh
ist 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 autossh
ist 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, autossh
besteht 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 ssh
funktioniert 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.
SIGTERM
ist die Standardeinstellung und diese ist 15
. SIGQUIT
ist 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 -15
nicht herunter es nicht nach unten, so SIGTERM
kann nicht verwendet werden.
pkill
ohne 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
-9
Stellt sicher, dass der Prozess nicht ordnungsgemäß beendet wird, sodass der Prozess nach dem Beenden ssh
immer noch vorhanden autossh
ist
Ohne -9
ist es immer noch schlimm, wenn Sie mehrere Tunnel laufen haben, pkill
werden sie alle töten
richtige weise ist es AUTOSSH_PIDFILE
env var dann nur kill
diese pid zu setzen
Ich weiß, dass dies beantwortet wurde, aber im Gegensatz zu den obigen Kommentaren werden pkill -3 autossh
die untergeordneten sshd-Prozesse für mich durch die Verwendung von NICHT beendet.
Ich benutze diese Funktion in meiner .bashrc
Datei.
Im Grunde ist es so, als würde --kill
man 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 ssh
und which autossh
überprüfen.
Solange das erste Argument nicht --kill
zutrifft, 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 dbserver1
tötet nur die Verbindungen zu dbserver1
autossh --kill dbserver
dbserver1 töten, dbserver2 usw.
autossh --kill dbserver
tötet alle autossh Verbindungen
Zur Verdeutlichung SOLLTE es nur die von autossh gestarteten SSH-Sitzungen beenden.
Wenn Sie ausführen, ps aux | grep ssh
wä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 ssh
und nicht den vollständigen Pfad, wodurch verhindert wird, dass meine normalen SSH-Sitzungen beendet werden.
Hoffe das hilft anderen.
$(which autossh)
statt einfach autossh
?