Теперь, когда у меня есть туннель 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.
Надеюсь, что это поможет другим.