Туннель S SH препятствует выходу моего порожденного скрипта - PullRequest
0 голосов
/ 12 января 2020

Я выполняю сценарий bash в Node.js следующим образом:

const script = child_process.spawn('local_script.sh');

const stdout = fs.createWriteStream('stdout');
const stderr = fs.createWriteStream('stderr');

script.stdout.pipe(stdout);
script.stderr.pipe(stderr);

script.on('close', function(code) {
  console.log('Script exited with code', code);
});

My local_script.sh загружает сценарий на мой удаленный сервер и выполняет его:

#!/bin/bash

FILE=/root/remote_script.sh
HOST=123.456.78.9

scp remote_script.sh root@${HOST}:${FILE}
ssh root@${HOST} bash ${FILE}

Наконец, мой remote_script.sh должен открыть туннель S SH (и выполнить некоторые другие действия, не относящиеся к этому вопросу):

#!/bin/bash

REDIS_HOST=318.353.31.3

ssh -f -n root@${REDIS_HOST} -L 6379:127.0.0.1:6379 -N &

Проблема в том, что, хотя я ' Когда я открываю туннель S SH в фоновом режиме, кажется, что мой remote_script.sh никогда не выходит, потому что событие Node.js close никогда не вызывается. Если я не не открою туннель S SH, он завершает и отправляет событие, как и ожидалось.

Как я могу убедиться, что скрипт завершается корректно после открытия S SH туннель? Обратите внимание, что я хочу, чтобы туннель сохранялся после завершения скрипта.

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Мне удалось решить эту проблему с помощью ssh -a root${HOST} bash ${FILE} в моем local_script.sh. Обратите внимание на флаг -a, который отключает мою переадресацию s sh agent .

. Важный признак состоял в том, что когда я запускаю remote_script.sh на моей удаленной машине напрямую, он будет делать все как ожидается чистый выход, но когда я попытаюсь выйти из системы, он будет зависать.

Очевидно, s sh не хочет завершать работу, пока есть активные соединения. Когда я набрал ~#, который показывает активные соединения s sh, он действительно показал мой агент переадресации s sh.

0 голосов
/ 12 января 2020

Я не проверял это, но я предполагаю, что фоновый сеанс s sh (remote -> REDIS) поддерживает работу удаленного tty и, таким образом, предотвращает закрытие локального -> удаленного сеанса. Попробуйте изменить remote_script. sh на это:

#!/bin/bash

redis_host=318.353.31.3

nohup ssh -f -n "root@${redis_host}" -L 6379:127.0.0.1:6379 -N >/dev/null 2>&1 &

Кстати, обратите внимание, что я изменил имя переменной в нижний регистр; Есть ряд переменных с заглавными буквами со специальным значением (включая HOST), и повторное использование любой из них может иметь странные последствия, поэтому переменные в нижнем или смешанном регистре предпочтительнее для использования скриптом. Кроме того, я дважды цитировал ссылку на переменную, которая в данном случае не имеет значения, но это хорошая общая привычка для тех случаев, когда она имеет значение.

...