Я хочу начать пару заданий на разных машинах с помощью ssh. Если пользователь прерывает основной скрипт, я хочу изящно закрыть все задания.Запуск процесса по ssh с использованием bash, а затем его уничтожение по sigint
Вот небольшой пример того, что я пытаюсь сделать:
#!/bin/bash
trap "aborted" SIGINT SIGTERM
aborted() {
kill -SIGTERM $bash2_pid
exit
}
ssh -t remote_machine /foo/bar.sh &
bash2_pid=$!
wait
Однако процесс bar.sh все еще работает на удаленной машине. Если я делаю те же команды в терминальном окне, он отключает процесс на удаленном хосте.
Есть ли простой способ сделать это, когда я запускаю скрипт bash? Или мне нужно заставить его войти в систему на удаленном компьютере, найти нужный процесс и убить его таким образом?
редактировать: Похоже, я должен идти с опцией B, убивая remotescript через другое соединение SSH
Так нет, я хочу знать, как я могу получить remotepid? Я пытался что-то вдоль линий:
remote_pid=$(ssh remote_machine '{ /foo/bar.sh & } ; echo $!')
Это не работает, так как он блокирует.
Как подождать, пока будет напечатана переменная, а затем «отпустите» подпроцесс?
Вы пробовали ловушку в своем удаленном скрипте? Возможно, SIGHUP? –
Я попытался захватить все сигналы, о которых я могу думать без успеха ... Я предполагаю, что мне просто нужно снова отправить ssh на удаленный компьютер и запустить kill на скрипте, но тогда мне нужен pid удаленный процесс ... – getekha
Попробуйте 'pkill', если так вы собираетесь идти. Сырой, но обычно эффективный. – bstpierre