Respuestas:
No, la forma correcta de matar autossh
es 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 autossh
es 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 autossh
es 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 ssh
conexió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.
SIGTERM
es el predeterminado, y ese es 15
. SIGQUIT
es 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 -15
no lo apagué , entonces SIGTERM
no se puede usar.
pkill
sin 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
-9
se asegura de que el proceso no salga con gracia, por lo que el ssh
proceso aún está allí cuando autossh
se termina
sin -9
sigue siendo malo, si tienes varios túneles funcionando, pkill
los matarás a todos
la forma correcta es establecer AUTOSSH_PIDFILE
env var entonces kill
ese pid solo
Sé que esto ha sido respondido, pero al contrario de los comentarios anteriores, el uso pkill -3 autossh
NO mata los procesos secundarios sshd para mí.
Yo uso esta función en mi .bashrc
archivo.
Básicamente, es como agregar un --kill
argumento 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 ssh
y which autossh
verificar 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 dbserver1
mata solo las conexiones a dbserver1
autossh --kill dbserver
matará dbserver1, dbserver2, etc.
autossh --kill dbserver
matará TODAS las conexiones autossh
Para aclarar, DEBE matar solo las sesiones SSH iniciadas por autossh.
Si ejecuta ps aux | grep ssh
mientras 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 ssh
y 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
?