Назад | Перейти на главную страницу

Завершить удаленный процесс при завершении фонового сеанса ssh

Итак, прямо сейчас у меня есть сценарий bash, который запускает команду на удаленном компьютере с помощью ssh. Машина, на которой запущен сценарий bash, является машиной Linux, а удаленная машина - машиной Windows, на которой запущен cygwin. Сценарий bash содержит следующие строки

#!/bin/bash
ssh -i key.pem user@ip "command1" &
# some other commands here, not included because they're not relevant to question
wait

command1 это длительный процесс. В настоящее время, когда я нажимаю Ctrl-C из своего сценария bash до завершения ожидания, command1 все еще работает на удаленном компьютере. По сути, он становится отстраненным и неконтролируемым. Я хочу, чтобы он завершился, когда я нажимаю Ctrl-C, иначе удаленная машина будет завалена множеством экземпляров command1, если я постоянно преждевременно завершу свой скрипт. Заметка фон & необходим, потому что я хочу запускать другие команды во время выполнения этой команды.

Я уже пробовал несколько способов

  1. Добавьте опцию "-t -t" для псевдотерминала
  2. Добавлена ​​строка ниже в надежде передать SIGINT в мои сеансы ssh

    trap 'kill -INT -$$' SIGINT
    

    Я также сделал вариант команды trap, где я получил список дочерних PID и повторил его, убивая каждого из них. Это тоже не сработало. SIGHUP тоже не работал.

Пока что единственный способ получить command1 для завершения, если я просто запустил команду ssh

ssh -t -i key.pem user@ip "command1"

без фона и введите Ctrl-C в том же терминале. Это даже не сработает, если я отправлю SIGINT или SIGHUP с другого терминала.

Как правильно завершить удаленные команды через фоновый ssh?

НОТА Это происходит только тогда, когда удаленная машина является средой cygwin.

Попробуйте что-то вроде этого:

#!/bin/bash
function killcommand1() {
    ssh -i key.pem user@ip 'kill `cat/tmp/command1_pid`'
}

trap "killcommand1" SIGINT

ssh -i key.pem user@ip 'command1 & echo $! > /tmp/command1_pid' &
# other commands
wait

Это сработало для меня при переходе от одной системы Linux к другой, и, к сожалению, у меня нет доступной установки cygwin, но этот способ отправки команды kill все равно может работать.