Risposte:
No, il modo corretto di uccidere autosshè semplicemente quello di uccidere il processo autossh, nient'altro.
Il motivo è
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
questo autosshè semplicemente uno script di shell, non un servizio . Avvia un nuovo programma, nella sua ultima riga,
exec /usr/lib/autossh/autossh "$@"
di nuovo non è un servizio. Per quanto riguarda exec(puoi ricontrollarlo nel wiki degli hacker di Bash ), è un comando incorporato nella shell che sostituisce la shell corrente con il seguente comando ( /usr/lib/autossh/autossh "$@"in questo caso) senza avviare un nuovo processo. Quindi, l' unico modo per fermare autosshè uccidere lo script chiamante, per esempio
pkill -3 autossh
(grazie a dviljoen per aver sottolineato l'importanza di usare il flag -3 , vedi sotto). Per inciso, l'uccisione della sshconnessione non funzionerà, perché il comando di chiamata ( cioè quello sopra) avvierà semplicemente una nuova connessione non appena si rende conto che la vecchia è stata abbandonata.
SIGTERMè l'impostazione predefinita e quella lo è 15. SIGQUITè 3, vedi superuser.com/questions/352147/what-does-kill-3-mean e en.wikipedia.org/wiki/Kill_(command) - Inoltre, FWIW, ho appena controllato e -15non lo spengo, quindi SIGTERMnon può essere usato.
pkillsenza segnale (= the default) non termina autossh.
esegui auto ssh con:
AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh
uccidilo con:
kill pid
BTW
pkill -9 autossh è un torto
-9si assicura che il processo non esca con garbo, quindi il sshprocesso è ancora presente quando il autosshprocesso viene ucciso
senza -9è ancora male, se hai più tunnel in esecuzione, pkillli uccideranno tutti
il modo corretto è impostare AUTOSSH_PIDFILEenv var quindi killsolo quel pid
So che è stata data una risposta, ma contrariamente ai commenti sopra, l'uso di pkill -3 autosshNON uccide i processi figlio sshd per me.
Uso questa funzione nel mio .bashrcfile.
Bascialmente, è come aggiungere un --killargomento all'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
È possibile eseguire which sshe which autosshverificare i percorsi sul proprio sistema.
Fintanto che il primo argomento non lo è --kill, passa gli argomenti all'autossh.
Questo script uccide le istanze di autossh e ssh. Questo è importante se si utilizza il port forwarding perché, uccidendo SOLO l'istanza di autossh non si uccide il tunnel, si impedisce semplicemente che si riconnetta se / quando si disconnette definitivamente.
Puoi anche specificare un termine di ricerca (nome host) per uccidere solo tunnel specifici.
autossh --kill dbserver1uccide solo le connessioni a dbserver1
autossh --kill dbserverucciderà dbserver1, dbserver2, ecc.
autossh --kill dbserverucciderà TUTTE le connessioni autossh
Per chiarire, DOVREBBE uccidere solo le sessioni SSH avviate da autossh.
Se corri ps aux | grep sshmentre hai entrambe le sessioni autossh e ssh in corso, vedrai che quelle avviate da autossh usano il percorso completo (/ usr / bin / ssh e / usr / lib / autossh / autossh).
Questo script abbina i risultati solo ai processi avviati con il percorso speicifc. L'ho fatto perché io (e presumo che la maggior parte delle persone) di solito scrivo sshe non l'intero percorso, il che gli impedisce di uccidere le mie normali sessioni SSH.
Spero che questo aiuti gli altri.
$(which autossh)anziché semplicemente autossh?