Это вопрос, который был рассмотрен несколько раз, не только здесь, но и на других сайтах сети обмена стека (например, Как заставить ssh убить удаленный процесс, когда я прерываю сам ssh? ). Однако я не могу заставить любое решение работать на меня.
Я запускаю команду через SSH. Всякий раз, когда я выхожу из ssh, я хочу, чтобы команда тоже умерла. Эта команда - демон ktserver, который выполняется бесконечно, пока вы не нажмете Ctrl-C.
Я запускаю его следующим образом: ssh -t compute-0-1 ktserver
и действительно, когда я нажимаю Ctrl-C, процесс завершается изящно, и сессия ssh заканчивается.
Однако если вместо нажатия Ctrl-C я уничтожу процесс ssh с помощью kill
команды (например, отправив SIGINT или SIGHUP), ktserver
процесс останется активным.
Как я могу заставить ktserver
всегда умереть независимо от того, как ssh
его убить?
РЕДАКТИРОВАТЬ : Если вместо того, чтобы ktserver
запустить что-то совершенно другое, например gedit
, все работает как шарм (т.е. gedit умирает, когда умирает соединение). Поэтому, возможно, что-то не так с самим процессом. Например, я подумал, что это может быть игнорирование SIGHUP или SIGINT. Однако когда я запускаю kill -1 ktserver
или kill -2 ktserver
, процесс умирает, как и ожидалось.
РЕДАКТИРОВАТЬ 2 : Как отмечает Марк Плотник, проблема связана с тем, что по каналу SSH не существует связи. Я подтвердил, запустив ssh -t <host> read
и убив процесс ssh впоследствии. read
был еще жив и здоров.
kill -9 ktserver
?ssh example.com dd ...
задания, выполненные до конца, даже через несколько часов послеssh
прекращения соединения из-за проблем с сетью. Если вы можете изменитьktserver
вариант, чтобы выводить что-то один раз, это может быть обходной путь.read
на удаленном компьютере, и после разрыва соединения ssh,read
не умер. К сожалению, я не могу изменить ktserver для вывода ничего. Тогда нет решения?shopt -s huponexit
). Можете ли вы проверить, работает ли это для вас?Ответы:
Обычно, когда соединение ssh умирает, оболочка также умирает. Вы можете настроить свою оболочку так, чтобы она отправляла сигнал -1 (SIGHUP), когда она завершается со всеми дочерними элементами.
Для bash вы можете настроить эту опцию с помощью встроенной команды shopt . (
shopt -s huponexit
).Для зш ты хочешь .
setopt
HUP
источник
ssh -t -t
(обратите внимание-t
дважды!) , Что вызывает tty-распределение, а не просто pty.Я обнаружил, что просто используя
-t -t
в качестве аргумента, чтобыssh
это работало. Мне не нужно было устанавливатьhuponexit
ни исходную, ни удаленную оболочку.Я проверил это следующим образом:
Не работает:
Это убило сессию ssh, но я вижу, что спящий процесс все еще выполняется на удаленном хосте (
ps -ef | grep sleep
показывает это).Работает:
Это убивает сеанс ssh, и удаленный спящий процесс также был убит. Я также проверил, что сигнал, который отправляется удаленному процессу, это
SIGINT
если вы используете Control- C. Я также проверил, что SIGKILL (-9), примененный кssh
процессу, также уничтожит удаленный процесс.РЕДАКТИРОВАТЬ 1:
Это было верно для
sleep
... для более упорных удаленных процессов, я обнаружил, чтоssh
обрабатывает ^ C иначе, чем SIGINT. Ctrl- Cработал, но неkill -INT $pid
сделалВот что я наконец-то придумал, что сработало для моего реального приложения (кража из других ответов).
Обратите внимание на вложенное использование двойных кавычек и одинарных кавычек. Обратите внимание, что ваш удаленный процесс ДОЛЖЕН реагировать на SIGHUP, фактически завершив работу!
источник
cat
. Например,ssh -ttq user@host '{ cmd; cmd; } | cat'
Ctrl-C
НЕ всегда эквивалентенkill -INT $pid
, см. мой ответ на unix.stackexchange.com/questions/377191/… и другой на stackoverflow.com/questions/8398845/… для подробностей кровавый ;-)^C
отправляет SIGINT . Так в чем же разница, если они не эквивалентны?Если ssh не распространяет сигналы, которые он получает, что вы ожидаете от него?
UPD. (специально для JosephR): это, очевидно, сама ошибка в вопросе, которая вытекает из недоразумения - «Процесс убийства, порожденный ssh, когда ssh умирает». SSH обычно не порождает процессы (иногда это происходит, но это другая история), вместо этого SSHD, когда мы смотрим на другую сторону соединения. SSH просто полагается на псевдо-терминальную абстракцию удаленного сервера. Вот почему единственное, что может помочь, - это способность терминала излучать сигналы на присоединенные процессы. Это несколько основополагающее значение для каждой UNIX-подобной системы.
источник
Решение, опубликованное здесь, не работает для меня, но так как этот вопрос возник первым, когда я искал решение для аналогичной проблемы, а также
-t -t
здесь был упомянут трюк, я опубликую решение, которое помогло мне попробовать другим.Моя долго работающая команда больше не выполнялась, когда соединение было разорвано следующим образом.
источник