Итак, прямо сейчас у меня есть сценарий 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, если я постоянно преждевременно завершу свой скрипт. Заметка фон & необходим, потому что я хочу запускать другие команды во время выполнения этой команды.
Я уже пробовал несколько способов
Добавлена строка ниже в надежде передать 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 все равно может работать.