Respostas:
Não, a maneira correta de matar autossh
é simplesmente matar o processo autossh
, nada mais.
A razão é
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
isso autossh
é simplesmente um script de shell, não um serviço . Ele inicia um novo programa, em sua última linha,
exec /usr/lib/autossh/autossh "$@"
novamente não é um serviço. Quanto a exec
(você pode checá-lo duas vezes no wiki dos hackers Bash ), é um comando embutido no shell que substitui o shell atual pelo seguinte comando ( /usr/lib/autossh/autossh "$@"
neste caso) sem iniciar um novo processo. Então, a única maneira de parar autossh
é matar o script de chamada, por exemplo
pkill -3 autossh
(obrigado a dviljoen por apontar a importância do uso da bandeira -3 , veja abaixo). Aliás, matar a ssh
conexão não funcionará, porque o comando de chamada ( ou seja , o acima) simplesmente iniciará uma nova conexão assim que perceber que a antiga foi descartada.
SIGTERM
é o padrão, e esse é 15
. SIGQUIT
é 3
, consulte superuser.com/questions/352147/what-does-kill-3-mean e en.wikipedia.org/wiki/Kill_(command) - Além disso, FWIW, verifiquei e -15
não o encerrei , então SIGTERM
não pode ser usado.
pkill
sem sinal (= the default
) também não termina autossh
.
execute o auto ssh com:
AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh
mate com:
kill pid
BTW
pkill -9 autossh
está errado
-9
garante que o processo não saia normalmente, portanto, o ssh
processo ainda estará lá quando o autossh
processo for morto
sem -9
ainda é ruim, se você tiver vários túneis em execução, pkill
matará todos eles
maneira correta é definir AUTOSSH_PIDFILE
env var então kill
só pid
Eu sei que isso foi respondido, mas, ao contrário dos comentários acima, o uso pkill -3 autossh
NÃO mata os processos filho sshd para mim.
Eu uso essa função no meu .bashrc
arquivo.
Basicamente, é como adicionar um --kill
argumento à reprodução automática.
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
Você pode executar which ssh
e which autossh
verificar os caminhos no seu sistema.
Desde que o primeiro argumento não seja --kill
, ele apenas passa os argumentos para a reprodução automática.
Este script mata as instâncias autossh & ssh. Isso é importante se você estiver usando o encaminhamento de porta, porque matar APENAS a instância do autossh não mata o túnel, apenas impede que ele se reconecte se / quando finalmente se desconectar.
Você também pode especificar um termo de pesquisa (nome do host) para eliminar apenas túneis específicos.
autossh --kill dbserver1
mata apenas as conexões com o dbserver1
autossh --kill dbserver
mata o dbserver1, o dbserver2, etc.
autossh --kill dbserver
mata todas as conexões autossh
Para esclarecer, ele deve matar apenas as sessões SSH iniciadas pelo autossh.
Se você executar ps aux | grep ssh
enquanto tiver sessões autossh e ssh em execução, verá que as iniciadas pelo autossh usam o caminho completo (/ usr / bin / ssh e / usr / lib / autossh / autossh).
Este script corresponde apenas aos resultados aos processos iniciados com o caminho específico. Fiz isso porque eu (e presumo que a maioria das pessoas) geralmente digita ssh
e não o caminho completo, o que evita que eu mate minhas sessões ssh normais.
Espero que isso ajude os outros.
$(which autossh)
vez de simplesmente autossh
?