Определенно, было бы предпочтительнее, чтобы ваша очистка управлялась с помощью ssh, запускающего процесс, а не переходила к уничтожению с помощью второго сеанса ssh позже.
Когда ssh подключен к вашему терминалу; ведет себя довольно хорошо. Тем не менее, отсоедините его от вашего терминала, и это станет (как вы заметили) болью, чтобы сигнализировать или управлять удаленными процессами. Вы можете закрыть ссылку, но не удаленные процессы.
Это оставляет вам один вариант: использовать ссылку как способ для удаленного процесса, чтобы получить уведомление о том, что ему необходимо завершить работу. Самый чистый способ сделать это - использовать блокировку ввода / вывода. Сделайте вход для удаленного чтения из ssh и когда вы хотите, чтобы процесс завершился; отправьте ему некоторые данные, чтобы разблокировать операцию чтения с пульта и продолжить очистку:
command & read; kill $!
Это то, что мы хотели бы запустить на пульте. Мы вызываем нашу команду, которую хотим запустить удаленно; мы читаем строку текста (блоки, пока не получим ее) и, когда закончим, дадим команду прекратить.
Чтобы отправить сигнал от нашего локального скрипта на удаленный компьютер, все, что нам нужно сделать сейчас, это отправить ему строку текста. К сожалению, Bash не дает вам много хороших вариантов здесь. По крайней мере, если вы хотите быть совместимым с bash <4.0. </p>
В bash 4 мы можем использовать совместные процессы:
coproc ssh user@host 'command & read; kill $!'
trap 'echo >&"${COPROC[1]}"' EXIT
...
Теперь, когда локальный скрипт завершает работу (не перехватывает INT
, TERM
и т. Д. Просто EXIT
), он отправляет новую строку в файл во втором элементе массива COPROC
. Этот файл представляет собой канал, который подключен к ssh
stdin
, эффективно направляя нашу линию к ssh
. Удаленная команда читает строку, завершает read
и kill
s команду.
Перед bash 4 все становится немного сложнее, поскольку у нас нет совместных процессов. В этом случае нам нужно сделать трубопровод самостоятельно:
mkfifo /tmp/mysshcommand
ssh user@host 'command & read; kill $!' < /tmp/mysshcommand &
trap 'echo > /tmp/mysshcommand; rm /tmp/mysshcommand' EXIT
Это должно работать практически во всех версиях bash.