Теперь, когда у меня есть туннель autossh, как правильно его остановить?
Кажется, нет простого способа сделать это. Документация по этой части неясна.
Кажется, что проще всего перезагрузить машину? Это правильно?
Теперь, когда у меня есть туннель 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 соединения не будет работать, потому что вызывающая команда (то есть та, что выше) просто запустит новое соединение, как только обнаружит, что старое соединение было сброшено.
Поиск по процессу:
PS Aux | grep ssh
Второй столбец - это PIDnumber
Убить процесс с помощью PID :)
убить -9 PIDnumber
Используйте 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 .
Bascially, это как добавление --kill аргумент 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
Вы можете запустить which ssh и which autossh чтобы проверить пути в вашей системе.
Пока первый аргумент не --kill , он просто передает аргументы autossh.
Этот скрипт убивает экземпляры autossh & ssh. Это важно, если вы используете переадресацию портов, потому что, убивая ТОЛЬКО экземпляр autossh, не убивает туннель, он просто предотвращает его повторное подключение, если / когда он, наконец, отключается.
Вы также можете указать критерий поиска (имя хоста), чтобы убить только определенные туннели.
autossh --kill dbserver1 убивает только соединения с dbserver1
autossh --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.
Надеюсь, что это поможет другим.