Odpowiedzi:
Nie, właściwym sposobem na zabicie autosshjest po prostu zabicie procesu autossh, nic więcej.
Powodem jest
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
że autosshjest to po prostu skrypt, a nie usługi . Zaczyna nowy program, w ostatniej linii,
exec /usr/lib/autossh/autossh "$@"
znowu nie jest to usługa. Jeśli chodzi o exec(możesz to dwukrotnie sprawdzić na wiki hakerów Bash ), jest to polecenie wbudowane w powłokę, które zastępuje bieżącą powłokę następującą komendą ( /usr/lib/autossh/autossh "$@"w tym przypadku) bez rozpoczynania nowego procesu. Tak więc jedynym sposobem na zatrzymanie autosshjest na przykład zabicie skryptu wywołującego
pkill -3 autossh
(dzięki dviljoen za zwrócenie uwagi na znaczenie używania flagi -3 , patrz poniżej). Nawiasem mówiąc, zabicie sshpołączenia nie zadziała, ponieważ polecenie wywołujące ( tj. Powyższe) po prostu rozpocznie nowe połączenie, gdy tylko zorientuje się, że stare połączenie zostało porzucone.
SIGTERMjest wartością domyślną, a ta jest 15. SIGQUITjest 3, patrz superuser.com/questions/352147/what-does-kill-3-mean i en.wikipedia.org/wiki/Kill_(command) - Ponadto, FWIW, właśnie sprawdziłem i -15nie wyłączam go, więc SIGTERMnie można go użyć.
pkillbez sygnału (= the default) również nie kończy się autossh.
uruchom auto ssh z:
AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh
zabij to:
kill pid
BTW
pkill -9 autossh jest źle
-9upewnia się, że proces nie kończy się z wdziękiem, więc sshproces jest nadal obecny, gdy autosshproces zostanie zabity
bez -9jest nadal złe, jeśli masz uruchomionych wiele tuneli, pkillzabije je wszystkie
poprawnym sposobem jest ustawienie AUTOSSH_PIDFILEenv var wtedy killtylko tego pid
Wiem, że udzielono odpowiedzi, ale w przeciwieństwie do powyższych komentarzy, użycie pkill -3 autosshNIE zabija dla mnie procesów potomnych sshd.
Korzystam z tej funkcji w moim .bashrcpliku.
Zasadniczo jest to jak dodanie --killargumentu do 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
Możesz uruchomić which sshi which autosshsprawdzić ścieżki w systemie.
Dopóki pierwszy argument nie jest --kill, po prostu przekazuje argumenty do autossh.
Ten skrypt zabija wystąpienia autossh i ssh. Jest to ważne, jeśli używasz przekierowania portów, ponieważ zabicie TYLKO instancji autossh nie zabija tunelu, po prostu uniemożliwia mu ponowne połączenie, jeśli / kiedy w końcu się rozłączy.
Możesz także określić wyszukiwane hasło (nazwę hosta), aby zabić tylko określone tunele.
autossh --kill dbserver1zabija tylko połączenia z dbserver1
autossh --kill dbserverzabije dbserver1, dbserver2 itp.
autossh --kill dbserverzabije WSZYSTKIE połączenia autossh
Aby to wyjaśnić, POWINNO zabić tylko sesje SSH rozpoczęte przez autossh.
Jeśli uruchomisz, ps aux | grep sshgdy masz uruchomione zarówno sesje autossh, jak i ssh, zobaczysz, że te rozpoczęte przez autossh używają pełnej ścieżki (/ usr / bin / ssh i / usr / lib / autossh / autossh).
Ten skrypt dopasowuje tylko wyniki do procesów uruchomionych ze ścieżką speicifc. Zrobiłem to, ponieważ ja (i zakładam, że większość ludzi) zwykle piszę, ssha nie pełną ścieżkę, co uniemożliwia zabicie moich normalnych sesji ssh.
Mam nadzieję, że pomoże to innym.
$(which autossh)zamiast po prostu autossh?