Respuestas:
No, la forma correcta de matar autosshes simplemente matar el proceso autossh, nada más.
La razón es
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
eso autosshes simplemente un script de shell, no un servicio . Comienza un nuevo programa, en su última línea,
exec /usr/lib/autossh/autossh "$@"
De nuevo no es un servicio. En cuanto a exec(puede verificarlo en la wiki de los piratas informáticos de Bash ), es un comando integrado en el shell que reemplaza el shell actual con el siguiente comando ( /usr/lib/autossh/autossh "$@"en este caso) sin iniciar un nuevo proceso. Entonces, la única forma de detenerse autosshes matar el script de llamada, por ejemplo
pkill -3 autossh
(gracias a dviljoen por señalar la importancia de usar la bandera -3 , ver más abajo). Por cierto, matar la sshconexión no funcionará, porque el comando de llamada ( es decir , el anterior) simplemente comenzará una nueva conexión tan pronto como se dé cuenta de que la anterior se ha caído.
SIGTERMes el predeterminado, y ese es 15. SIGQUITes decir 3, consulte superuser.com/questions/352147/what-does-kill-3-mean y en.wikipedia.org/wiki/Kill_(command) - Además, FWIW, acabo de comprobarlo y -15no lo apagué , entonces SIGTERMno se puede usar.
pkillsin señal (= the default) tampoco termina autossh.
ejecutar auto ssh con:
AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh
mátalo con:
kill pid
Por cierto
pkill -9 autossh es un error
-9se asegura de que el proceso no salga con gracia, por lo que el sshproceso aún está allí cuando autosshse termina
sin -9sigue siendo malo, si tienes varios túneles funcionando, pkilllos matarás a todos
la forma correcta es establecer AUTOSSH_PIDFILEenv var entonces killese pid solo
Sé que esto ha sido respondido, pero al contrario de los comentarios anteriores, el uso pkill -3 autosshNO mata los procesos secundarios sshd para mí.
Yo uso esta función en mi .bashrcarchivo.
Básicamente, es como agregar un --killargumento a 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
Puede ejecutar which sshy which autosshverificar las rutas en su sistema.
Mientras el primer argumento no lo sea --kill, simplemente pasa los argumentos a autossh.
Este script mata las instancias de autossh y ssh. Esto es importante si está utilizando el reenvío de puertos porque, al matar SOLAMENTE la instancia de autossh no mata el túnel, solo evita que se vuelva a conectar si / cuando finalmente se desconecta.
También puede especificar un término de búsqueda (nombre de host) para eliminar solo túneles específicos.
autossh --kill dbserver1mata solo las conexiones a dbserver1
autossh --kill dbservermatará dbserver1, dbserver2, etc.
autossh --kill dbservermatará TODAS las conexiones autossh
Para aclarar, DEBE matar solo las sesiones SSH iniciadas por autossh.
Si ejecuta ps aux | grep sshmientras tiene las sesiones autossh y ssh ejecutándose, verá que las iniciadas por autossh usan la ruta completa (/ usr / bin / ssh y / usr / lib / autossh / autossh).
Este script solo hace coincidir los resultados con los procesos iniciados con la ruta específica. Hice esto porque (y supongo que la mayoría de las personas) usualmente escribo sshy no la ruta completa, lo que evita que mate mis sesiones ssh normales.
Espero que esto ayude a otros.
$(which autossh)lugar de simplemente autossh?