Odpowiedzi:
Nie, właściwym sposobem na zabicie autossh
jest po prostu zabicie procesu autossh
, nic więcej.
Powodem jest
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
że autossh
jest 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 autossh
jest 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 ssh
połą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.
SIGTERM
jest wartością domyślną, a ta jest 15
. SIGQUIT
jest 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 -15
nie wyłączam go, więc SIGTERM
nie można go użyć.
pkill
bez 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
-9
upewnia się, że proces nie kończy się z wdziękiem, więc ssh
proces jest nadal obecny, gdy autossh
proces zostanie zabity
bez -9
jest nadal złe, jeśli masz uruchomionych wiele tuneli, pkill
zabije je wszystkie
poprawnym sposobem jest ustawienie AUTOSSH_PIDFILE
env var wtedy kill
tylko tego pid
Wiem, że udzielono odpowiedzi, ale w przeciwieństwie do powyższych komentarzy, użycie pkill -3 autossh
NIE zabija dla mnie procesów potomnych sshd.
Korzystam z tej funkcji w moim .bashrc
pliku.
Zasadniczo jest to jak dodanie --kill
argumentu 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 ssh
i which autossh
sprawdzić ś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 dbserver1
zabija tylko połączenia z dbserver1
autossh --kill dbserver
zabije dbserver1, dbserver2 itp.
autossh --kill dbserver
zabije WSZYSTKIE połączenia autossh
Aby to wyjaśnić, POWINNO zabić tylko sesje SSH rozpoczęte przez autossh.
Jeśli uruchomisz, ps aux | grep ssh
gdy 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ę, ssh
a 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
?