Я запускаю команду ниже и отслеживаю выходной файл в другой системе:
ssh $ip_address 'for n in 1 2 3 4 5; do sleep 10; echo $n >>/tmp/count; done'
Если я убью команду ssh, используя ^C
или просто убив терминал, на котором я вошел, я бы также ожидал, что удаленная команда завершится. Однако этого не происходит: /tmp/count
получает все числа 1–5 независимо и ps -ejH
показывает, что оболочка и ее sleep
дочерний элемент продолжают работать.
Это ожидаемое поведение и задокументировано ли оно где-нибудь? Могу ли я отключить это? После прочтения я ожидал, что мне придется явно включить такое поведение с помощью nohup, а не по умолчанию.
Я просмотрел справочные страницы по ssh и sshd, но не заметил ничего очевидного, и Google указывает мне на инструкции по включению этого поведения, а не по его выключению.
Я использую Red Hat Enterprise Linux 6.2 с обоими учетными записями root и bash.
-tt
вместо,-t
если у самого ssh нет выделенного tty. SSH не получит выделенный tty, если ssh сразу после вызова вызывается с помощью опций, таких как-f
или-n
.Попробуйте выделить psuedo-tty своей
ssh
командой.ssh -t $ip_address 'for n in 1 2 3 4 5; do sleep 10; echo $n >>/tmp/count; done'
Когда вы отключаете сессию ssh, процесс должен завершиться.
Так как это псевдотермическая информация, ваша инициализация оболочки, вероятно, не собирается исходные файлы конфигурации, оставляя вашу команду в очень чистой среде. Вам может потребоваться настроить
.ssh/environment
файл, который определяет переменные среды, такие как PATH. Отman 1 ssh
источник
В качестве альтернативы использованию
-t
опции дляssh
принудительного завершения удаленной команды приssh
выходе из клиента или (его уничтожении) можно использовать именованный канал для преобразования «EOF в SIGHUP» приsshd
закрытии stdin of (см. Ошибку 396 - sshd процессы сирот, когда pty не выделено ).источник
Это лучший способ, который я нашел для этого. Вы хотите что-то на стороне сервера, которое пытается прочитать стандартный ввод, а затем убивает группу процессов при сбое, но вы также хотите, чтобы ввод на стороне клиента блокировал до тех пор, пока процесс на стороне сервера не будет завершен, и не оставлял длительные процессы, такие как <( сон бесконечность) может.
На самом деле он, кажется, нигде не перенаправляет стандартный вывод, но он функционирует как блокирующий ввод и избегает ввода нажатий клавиш.
Соответствующая ошибка openssh: https://bugzilla.mindrot.org/show_bug.cgi?id=396#c14
источник
Если вы хотите отключить это (по-видимому, поведение по умолчанию), вам нужно включить ssh-keep-alive на стороне клиента или сервера.
Если вы посмотрите на ssh-keep-alive-options в man-страницах, то увидите, что по умолчанию они отключены.
источник
Мой ответ основан на Теру. Мне нужен вспомогательный скрипт
~/helper
на сервере server.ip:Если это называется, например, с
и выполняется
echo hello from server
в server.ip, а затем ssh клиент будет прерван.Если это называется, например, с
kill -9 $CHID
остановит скрипт на сервере тоже. Для меняkill -INT $CHID
не работает, но я не знаю почему.В ответе teru, команда ssh будет ждать вечно, когда удаленная команда завершится, потому что
cat
никогда не завершится .Все ответы с ssh -t у меня не работали
kill
, а только с Ctrl-C.Редактировать: я узнал, что это работает от новой Ubuntu 14.01 до старшей научной коробки Linux - но не наоборот. Таким образом, я думаю, что нет общего решения. Weird.
источник