Теперь, когда у меня есть туннель autossh, как правильно его остановить?
Кажется, нет простого способа сделать это. Документация по этой части неясна.
Кажется, простой способ перезагрузить машину? Это верно?
Нет, правильный способ убить autossh
- это просто убить процесс autossh
, больше ничего.
Причина в
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
это autossh
просто сценарий оболочки, а не сервис . Он запускает новую программу в самой последней строке,
exec /usr/lib/autossh/autossh "$@"
опять не сервис. Что касается exec
(вы можете дважды проверить это в вики хакеров Bash ), это встроенная команда оболочки, которая заменяет текущую оболочку следующей командой ( /usr/lib/autossh/autossh "$@"
в данном случае) без запуска нового процесса. Таким образом, единственный способ остановить autossh
это уничтожить вызывающий скрипт, например
pkill -3 autossh
(спасибо dviljoen за указание на важность использования флага -3 , см. ниже). Между прочим, уничтожение ssh
соединения не будет работать, потому что вызывающая команда ( то есть та, что указана выше) просто запустит новое соединение, как только обнаружит, что старое соединение было сброшено.
SIGTERM
по умолчанию, и это один15
.SIGQUIT
это3
, см superuser.com/questions/352147/what-does-kill-3-mean и en.wikipedia.org/wiki/Kill_(command) - Кроме того , FWIW, я только что проверил и-15
не закрыть его, поэтомуSIGTERM
не может быть использован.pkill
без сигнала (=default
) также не прекращаетсяautossh
.Поиск процесса:
Второй столбец - это PIDnumber
Убить процесс с помощью PID :)
Используйте sudo, если у вас нет привилегий root.
источник
запустить авто SSH с:
AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh
убить его с помощью:
kill pid
КСТАТИ
pkill -9 autossh
это неправильно-9
гарантирует, что процесс не завершится корректно, поэтомуssh
процесс все еще там, когдаautossh
процесс завершенбез
-9
все равно плохо, если у вас работает несколько туннелей,pkill
убьет их всехправильный путь - установить
AUTOSSH_PIDFILE
env var, тогдаkill
только pidисточник
Я знаю, что на это ответили, но вопреки комментариям выше, использование
pkill -3 autossh
НЕ убивает дочерние процессы sshd для меня.Я использую эту функцию в моем
.bashrc
файле.По сути, это все равно, что добавить
--kill
аргумент к autossh.Вы можете запустить
which ssh
иwhich autossh
проверить пути в вашей системе.Пока первый аргумент не так
--kill
, он просто передает аргументы autossh.Этот скрипт убивает экземпляры autossh & ssh. Это важно, если вы используете переадресацию портов, потому что, убивая ТОЛЬКО экземпляр autossh, не убивает туннель, он просто предотвращает его повторное подключение, если / когда он, наконец, отключается.
Вы также можете указать условие поиска (имя хоста), чтобы убить только определенные туннели.
autossh --kill dbserver1
убивает только соединения с dbserver1autossh --kill dbserver
, убивает dbserver1, dbserver2 и т. д.autossh --kill dbserver
убивает ВСЕ соединения autosshДля пояснения, он ДОЛЖЕН уничтожать только сеансы SSH, запущенные autossh.
Если вы запустите
ps aux | grep ssh
сеанс autossh и ssh, то вы увидите, что те, которые запущены autossh, используют полный путь (/ usr / bin / ssh и / usr / lib / autossh / autossh).Этот сценарий сопоставляет результаты только с процессами, запущенными с указанным путем. Я сделал это, потому что я (и я полагаю, что большинство людей) обычно печатает,
ssh
а не полный путь, что удерживает его от уничтожения моих обычных сессий ssh.Надеюсь, что это поможет другим.
источник
$(which autossh)
вместо простоautossh
?