Как заставить ssh убить удаленный процесс, когда я прерываю сам ssh? - PullRequest
20 голосов
/ 01 декабря 2008

В скрипте bash я выполняю команду на удаленной машине через ssh. Если пользователь нарушает работу сценария нажатием Ctrl + C, он останавливает только сценарий - даже не ssh-клиент. Более того, даже если я убью ssh-клиент, удаленная команда все еще работает ...

Как заставить bash уничтожить локальный ssh-клиент и вызвать удаленную команду на Crtl + c?

Простой скрипт:

#/bin/bash
ssh -n -x root@db-host 'mysqldump db' -r file.sql

Ответы [ 4 ]

19 голосов
/ 03 декабря 2008

В конце концов я нашел такое решение:

#/bin/bash
ssh -t -x root@db-host 'mysqldump db' -r file.sql

Итак - я использую '-t' вместо '-n'. Удаление '-n' или использование пользователя, отличного от пользователя root, не помогает.

3 голосов
/ 09 декабря 2009

Когда ваша сессия SSH заканчивается, ваша оболочка получит SIGHUP. (сигнал зависания). Вы должны убедиться, что он отправляет это всем процессам, запущенным с него. Для bash попробуйте shopt -s huponexit; your_command. Это может не сработать, потому что на странице руководства написано, что huponexit работает только для интерактивных оболочек.

Я помню, что сталкивался с этим, когда пользователи выполняли задания в моем кластере, и нужно ли им использовать nohup или нет (чтобы получить поведение, противоположное тому, что вы хотите), но я не могу найти ничего на странице справки bash о том, дочерние процессы игнорируют SIGHUP по умолчанию. Надеюсь, huponexit сделает свое дело. (Думаю, вы могли бы поместить этот объект в ваш .bashrc вместо командной строки.)

Ваш ssh -t должен работать, так как, когда соединение закрывается, чтение из терминала получит EOF или ошибку, и это заставит большинство программ завершиться.

2 голосов
/ 02 декабря 2008

Знаете ли вы, какие опции вы передаете в ssh? Я думаю, нет. Опция -n перенаправляет ввод из / dev / null, поэтому процесс, который вы запускаете на удаленном хосте, вероятно, не видит SIGINT из Ctrl-C.

Теперь давайте поговорим о том, насколько плоха идея разрешить удаленный вход в систему root:

Это действительно очень плохая идея. Взгляните на HOWTO: установите ssh-ключи , чтобы узнать, как безопасно управлять удаленным выполнением процесса через ssh. Если вам нужно запустить что-то с привилегиями удаленно, вам, вероятно, понадобится решение, которое включает в себя открытый ключ ssh со встроенной командой и скрипт, который запускается от имени sudo.

1 голос
/ 01 декабря 2008
trap "some_command" SIGINT

будет выполняться some_command локально при нажатии Ctrl + C. help trap расскажет вам о других своих возможностях.

Что касается вопроса ssh, я мало что знаю о ssh. Может быть, вы можете заставить его вызвать ssh -n -x root@db-host 'killall mysqldump' вместо some_command, чтобы убить удаленную команду?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...