Уничтожьте процесс, порожденный ssh, когда ssh умрет

Это - конкретное распределение, но несколько вещей я могу думать:

/etc/mtab, /etc/adjtime и /etc/resolv.conf типичные файлы, которым, возможно, понадобится измененный. /etc/motd и /etc/issue мог бы быть также. cups обновления некоторые его конфигурационные файлы отдельно также. Некоторые вещи могли бы хотеть создать a nologin файл в /etc также.

В большинстве экземпляров необходимо смочь заменить файл символьной ссылкой на одну под /var.

23
28.01.2018, 15:47
4 ответа

Обычно, когда соединение SSH умирает, оболочка также умирает. Можно настроить оболочку для отправки сигнала-1 (SIGHUP), когда это завершается всем его детям.

Для удара можно настроить эту опцию через встроенную команду shopt. (shopt -s huponexit).

Для zsh Вы хотите setoptHUP.

13
27.01.2020, 19:42
  • 1
    я думал, что это было решением моей текущей проблемы, но это, кажется, не работает. Я работаю: $host ssh "$OtherHost:/tmp scp LargeFile.dat" и pid= $! и затем пытаясь остановить ту передачу с: shopt-s huponexit; уничтожьте $pid, но scp не останавливается, когда я уничтожаю ssh, который я запустил. Какие-либо мысли? –  David Doria 17.03.2014, 19:46
  • 2
    Можно ли протестировать с набором опций оболочки прежде, чем запустить команду scp? Или путем запуска оболочки, установки shopt и запуска scp? –  Hennes 10.06.2014, 18:04
  • 3
    Это работает на меня, но я должен был сначала удостовериться, что использовал ssh -t -t, (заметьте -t дважды!), который вызывает tty выделение, а не просто имущество. Примечание –  Nicolas Wu 10.08.2014, 15:10

Если бы ssh не распространяет сигналы, он получает то, что Вы ожидали бы от него?

UPD. (особенный для JosephR): это - очевидно, сама рассматриваемая ошибка, которая следует из недоразумения — "Уничтожают процесс, порожденный ssh, когда ssh умирает". SSH обычно не порождает процессы (иногда, он делает, но это - другая история), SSHD делает вместо этого, когда мы смотрим на другую сторону соединения. SSH просто полагается на удаленный сервер абстракции псевдотерминала, имеет. Вот почему единственная вещь, которая может помочь, существует способность терминала испустить сигналы к ее приложенным процессам. Это является несколько очень простым для каждой подобной UNIX системы.

1
27.01.2020, 19:42
  • 1
    Это не предоставляет ответ на вопрос. Чтобы критиковать или запросить разъяснение от автора, оставьте комментарий ниже их сообщения. –  Anthon 17.12.2013, 18:06
  • 2
    @Anthon, это - объяснение. Но ничье утверждение этого должно быть единственным корректным ответом. Спасибо за Ваш комментарий ниже. –  poige 17.12.2013, 22:05
  • 3
    @poige, Возможно, излагает в деталях объяснение, таким образом, это может быть полезно для OP и других. –  Joseph R. 18.12.2013, 02:23
  • 4
    @JosephR., хорошо, только для Вас. –  poige 18.12.2013, 03:03
  • 5
    Если я говорю, "Уничтожают процесс, порожденный sshd, когда соединение SSH потеряно", это звучало бы лучше Вам? Я не думаю, что перефразирование решает мою проблему всегда. –  GermanK 18.12.2013, 20:43

Вы можете использовать поиск для всех, включая размер ( man find ):

 -size n[cwbkMG]
          File uses n units of space.  The following suffixes can be used:
          `b'    for  512-byte blocks (this is the default if no suffix is used)
          `c'    for bytes
          `w'    for two-byte words
          `k'    for Kilobytes (units of 1024 bytes)
          `M'    for Megabytes (units of 1048576 bytes)
          `G'    for Gigabytes (units of 1073741824 bytes)

Так вы можете сделать:

find . -name "*.gz" -size -4k -mtime -1 -printf 'Failure %p\n'
find . -name "*.gz" -size -4k -mtime +1 -printf 'Success %p\n'
-121--166622-

Вы можете скопировать ~/.gnupg/trustdb.gpg с одной машины на другую.

Вы также можете экспортировать значения ownertrust (которые имеют значение) и импортировать их на новый компьютер:

gpg --export-ownertrust > otrust.txt

rm ~/.gnupg/trustdb.gpg
gpg --import-ownertrust < otrust.txt

См. gpg manpage для получения подробной информации (хотя версия на сайте не говорит намного больше, чем у меня).

-121--108335-

Я обнаружил, что простое использование -t -t в качестве аргумента ssh делает его работоспособным. Мне не пришлось устанавливать huponexit в исходную или удаленную оболочку.

Я проверил это следующим образом:

Не работает:

ssh user@remote sleep 100
^C

Это остановило сеанс ssh, но я вижу, что процесс сна все еще выполняется на удаленном хосте ( ps -ef | grep sleep ).

Работает ли:

ssh -t -t user@remote sleep 100
^C

Это убивает ssh-сеанс и удалённый процесс сна также был остановлен. Я также проверил, что сигнал, который посылается удаленному процессу, SIGINT , если вы используете Control - C . Я также проверил, что SIGKILL (-9), примененный к процессу ssh , также уничтожит удаленный процесс.

EDIT 1:

Значение для сна было верно... для более упорных удаленных процессов я обнаружил, что ssh обрабатывает ^ C иначе, чем SIGINT. Ctrl - C сработал, но kill -INT $ pid не сработал.

Вот что я наконец-то придумал, что сработало для моего фактического приложения (кража из других ответов).

ssh -t -t -i id_rsa user@mic0 "/bin/sh -O huponexit -c 'sleep 100'"

Обратите внимание на вложенное использование двойных кавычек и одиночных кавычек. Обратите внимание, что ваш удаленный процесс ДОЛЖЕН ответить на SIGHUP, фактически выйдя!

13
27.01.2020, 19:42

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

ssh -t -t -o ControlMaster=auto -o ControlPath='~/test.ssh' your_remote_ip_goes_here "your_long_running_command" &
sleep 100
ssh -o ControlPath='~/test.ssh' -O exit your_remote_ip_goes_here

Моя длительная команда больше не выполнялась, когда соединение было разорвано таким образом.

0
27.01.2020, 19:42

Теги

Похожие вопросы