Відповіді:
Ні, правильний спосіб вбити 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
без сигналу (= the default
) також не припиняється autossh
.
запустити автоматичний 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
аргумент до автоматичного пошуку.
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 & ssh. Це важливо, якщо ви використовуєте переадресацію портів, оскільки, вбиваючи ТОЛЬКО екземпляр autossh, не вбивається тунель, він просто запобігає його повторному підключенню, якщо / коли він остаточно відключиться.
Ви також можете вказати пошуковий термін (ім'я хоста), щоб знищити лише певні тунелі.
autossh --kill dbserver1
вбиває тільки з'єднання з dbserver1
autossh --kill dbserver
буде вбивати dbserver1, dbserver2 і т.д.
autossh --kill dbserver
буде вбивати ВСЕ з'єднання autossh
Для уточнення потрібно Вбивати тільки сеанси SSH, розпочаті автошш.
Якщо ви запустите, ps aux | grep ssh
поки у вас запущені сеанси autossh та ssh, ви побачите, що ті, розпочаті автошшхом, використовують повний шлях (/ usr / bin / ssh та / usr / lib / autossh / autossh).
Цей скрипт відповідає лише результатам процесам, розпочатим зі шляху speicifc. Я зробив це, тому що я (і я вважаю, що більшість людей) зазвичай набирає, ssh
а не повний шлях, що не дозволяє вбити мої звичайні сеанси ssh.
Сподіваюся, що це допоможе іншим.
$(which autossh)
а не просто autossh
?