Ответы:
Нет, правильный способ убить 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.
запустить авто SSH с:
AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh
убить его с помощью:
kill pid
КСТАТИ
pkill -9 autossh это неправильно
-9гарантирует, что процесс не завершится корректно, поэтому sshпроцесс все еще там, когда autosshпроцесс завершен
без -9все равно плохо, если у вас работает несколько туннелей, pkillубьет их всех
правильный путь - установить AUTOSSH_PIDFILEenv var, тогда killтолько pid
Я знаю, что на это ответили, но вопреки комментариям выше, использование pkill -3 autosshНЕ убивает дочерние процессы sshd для меня.
Я использую эту функцию в моем .bashrcфайле.
По сути, это все равно, что добавить --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.
Надеюсь, что это поможет другим.
$(which autossh)вместо просто autossh?