15

Теперь, когда у меня есть туннель autossh, как правильно его остановить?

Кажется, нет простого способа сделать это. Документация по этой части неясна.

Кажется, что проще всего перезагрузить машину? Это правильно?

4 ответа4

16

Нет, правильный способ убить 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 соединения не будет работать, потому что вызывающая команда (то есть та, что выше) просто запустит новое соединение, как только обнаружит, что старое соединение было сброшено.

4

Поиск по процессу:

PS Aux | grep ssh

Второй столбец - это PIDnumber

Убить процесс с помощью PID :)

убить -9 PIDnumber

Используйте sudo, если у вас нет привилегий root.

3

запустить авто SSH с:

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

убить его с помощью:

kill pid

КСТАТИ

pkill -9 autossh это неправильно

-9 гарантирует, что процесс не завершится корректно , поэтому процесс ssh все еще существует, когда процесс autossh

без -9 все равно плохо, если у вас работает несколько туннелей, pkill убьет их всех

правильный путь - установить AUTOSSH_PIDFILE env var, а затем kill только этот pid

1

Я знаю, что на это был дан ответ, но вопреки приведенным выше комментариям, использование 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.

Надеюсь, что это поможет другим.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .