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 jest15
.SIGQUIT
jest3
, 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ęcSIGTERM
nie można go użyć.pkill
bez sygnału (= thedefault
) 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ęcssh
proces jest nadal obecny, gdyautossh
proces zostanie zabitybez
-9
jest nadal złe, jeśli masz uruchomionych wiele tuneli,pkill
zabije je wszystkiepoprawnym sposobem jest ustawienie
AUTOSSH_PIDFILE
env var wtedykill
tylko tego pidźródło
Wyszukaj proces:
Druga kolumna to PIDnumber
Zabij proces przez PID :)
Użyj sudo, jeśli nie masz uprawnień roota.
źródło
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.Możesz uruchomić
which ssh
iwhich 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 dbserver1autossh --kill dbserver
zabije dbserver1, dbserver2 itp.autossh --kill dbserver
zabije WSZYSTKIE połączenia autosshAby 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.
źródło
$(which autossh)
zamiast po prostuautossh
?