Réponses:
Non, la bonne façon de tuer autossh
est simplement de tuer le processus autossh
, rien d'autre.
La raison est
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
c'est autossh
simplement un script shell, pas un service . Il démarre un nouveau programme, dans sa toute dernière ligne,
exec /usr/lib/autossh/autossh "$@"
encore une fois pas un service. Quant à exec
(vous pouvez le vérifier dans le wiki des pirates Bash ), il s'agit d'une commande intégrée au shell qui remplace le shell actuel par la commande suivante ( /usr/lib/autossh/autossh "$@"
dans ce cas) sans démarrer un nouveau processus. Donc, la seule façon d'arrêter autossh
est de tuer le script appelant, par exemple
pkill -3 autossh
(merci à dviljoen d' avoir souligné l'importance d'utiliser l' indicateur -3 , voir ci-dessous). Par ailleurs, la suppression de la ssh
connexion ne fonctionnera pas, car la commande appelante ( c'est-à - dire celle ci-dessus) démarrera simplement une nouvelle connexion dès qu'elle réalisera que l'ancienne a été supprimée.
SIGTERM
est la valeur par défaut, et celle-là l'est 15
. SIGQUIT
est 3
, voir superuser.com/questions/352147/what-does-kill-3-mean et en.wikipedia.org/wiki/Kill_(command) - Aussi, FWIW, je viens de vérifier et -15
ne l'arrête pas, SIGTERM
ne peut donc pas être utilisé.
pkill
sans signal (= le default
) ne se termine pas non plus autossh
.
lancez auto ssh avec:
AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh
tuez-le avec:
kill pid
BTW
pkill -9 autossh
est un tort
-9
s'assure que le processus ne se termine pas correctement, donc le ssh
processus est toujours là quand le autossh
processus est tué
sans -9
est toujours mauvais, si vous avez plusieurs tunnels en cours d'exécution, pkill
les tuera tous
la bonne façon est de définir AUTOSSH_PIDFILE
env var alors kill
que pid seulement
Je sais que cela a été répondu, mais contrairement aux commentaires ci-dessus, l'utilisation pkill -3 autossh
ne tue PAS les processus enfants sshd pour moi.
J'utilise cette fonction dans mon .bashrc
fichier.
Fondamentalement, c'est comme ajouter un --kill
argument à autossh.
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
Vous pouvez exécuter which ssh
et which autossh
vérifier les chemins sur votre système.
Tant que le premier argument ne l'est pas --kill
, il passe simplement les arguments à autossh.
Ce script tue les instances autossh & ssh. Ceci est important si vous utilisez la redirection de port car, en tuant UNIQUEMENT l'instance autossh ne tue pas le tunnel, cela l'empêche simplement de se reconnecter si / quand il se déconnecte finalement.
Vous pouvez également spécifier un terme de recherche (nom d'hôte) pour supprimer uniquement des tunnels spécifiques.
autossh --kill dbserver1
tue uniquement les connexions à dbserver1
autossh --kill dbserver
tuera dbserver1, dbserver2, etc.
autossh --kill dbserver
tuera TOUTES les connexions autossh
Pour clarifier, il DEVRAIT tuer uniquement les sessions SSH démarrées par autossh.
Si vous exécutez ps aux | grep ssh
alors que vous avez à la fois des sessions autossh et ssh en cours d'exécution, vous verrez que celles démarrées par autossh utilisent le chemin complet (/ usr / bin / ssh et / usr / lib / autossh / autossh).
Ce script ne fait correspondre les résultats qu'aux processus démarrés avec le chemin speicifc. Je l'ai fait parce que je (et je suppose que la plupart des gens) tapent généralement ssh
et non le chemin complet, ce qui l'empêche de tuer mes sessions ssh normales.
J'espère que cela aidera les autres.
$(which autossh)
au lieu de simplement autossh
?