NodeJS child_process: запустить два процесса параллельно через ssh и потоки вывода

Во-первых, это можно было легко сделать с помощью ssh2, но я не мог использовать его, потому что он не поддерживает аутентификацию сертификата.

Следовательно, проблема:

Я использую child_process для запуска ssh binary и подключения к удаленному серверу. Я могу запускать команды и получать их результаты через stdin и stdout порожденного процесса. Но у меня есть случай, когда мне нужно запускать две команды параллельно. Одна из них - это длительная команда, которую мне нужно передавать построчно, а другая - легкая команда, ввод которой зависит от содержимого потоковых строк. Можно ли сделать это без создания двух ssh процессов?

Также приветствуются обходные пути с использованием ssh2 или чего-то подобного.

(Edit) Добавление описательного примера:

Process 1 работает долго и продолжает писать строки в stdout / file, Process 2 необходимо запускать на каждой строке, как всякий раз, когда строка создается Process 1. В каждой точке, когда Process 2 для строки завершается, мне нужны как input line printed by Process 1, так и the corresponding output of Process 2


person Erric    schedule 14.06.2018    source источник


Ответы (1)


есть очень простой способ: использовать gnu parallel. https://www.gnu.org/software/parallel/ Устанавливается в Ubuntu fe с sudo apt -y install parallel

ssh host \
  'echo -e "date > 1.out && sleep 5\n date > 2.out && sleep 5" | parallel -j0'
ssh host cat 1.out
    > Th 14. Jun 10:54:15 CEST 2018
ssh host cat 2.out
    > Th 14. Jun 10:54:15 CEST 2018

Теперь вы можете использовать ssh для каталогов 1.out и 2.out.

Но давайте рассмотрим ваше более позднее редактирование:

prog1.sh:

for i in {1..5}; do
  echo $i >> 1.out
  sleep 1;
done
echo "done" >> 1.out
sleep 1
echo -e "\n" >> 1.out

prog2.sh (контролирует 1.out и выполняет некоторую команду, здесь хвост):

inotifywait -e close_write,moved_to,create -m . |
  while read -r directory events filename; do
    if [ "$filename" = "1.out" ]; then
      # 1.out changed we need to do something
      res=$(tail -1 1.out)
        if [ $res = "done" ]; then
            break;
        fi
      fi
  done

ssh host 'echo -e "./prog2.sh \n ./prog1.sh" | parallel -j 2'
person Kaveh Vahedipour    schedule 14.06.2018
comment
Но мне нужны выходные потоки отдельно для первого и второго процесса. Как мне добиться этого с помощью параллелизма? - person Erric; 14.06.2018
comment
дайте-ка подумать. интересно. - person Kaveh Vahedipour; 14.06.2018
comment
Довольно близко, но моя проблема немного сложнее, я добавил более наглядный пример к вопросу - person Erric; 14.06.2018
comment
остальное действительно программирование. Я только что показал вам, как запустить 2 программы параллельно удаленно. Механизм, который вы описываете, представляет собой проблему программирования двух взаимодействующих программ. так что первый вызов выше остается как есть. вторая программа должна отслеживать события файлов на 1. выходе и что-то делать. но опять же, это проблема программирования. на каком языке программирования написан процесс 2? у тебя есть код? - person Kaveh Vahedipour; 14.06.2018
comment
На самом деле я не контролирую эти два процесса, поскольку они оба являются стандартными командами unix. И у меня нет доступа на запись на сервере, чтобы написать программу / сценарий оболочки. Может быть, есть совсем другой подход, чем параллельный? - person Erric; 14.06.2018
comment
если бы вы написали код, можно было бы увидеть, как решить вашу конкретную проблему. - person Kaveh Vahedipour; 14.06.2018
comment
Вот краткий код, который я написал с помощью node-ssh: codehare.io/5N9Yr4. Это именно то, что мне нужно, но, к сожалению, я не могу использовать это из-за проблемы с аутентификацией. - person Erric; 14.06.2018
comment
вы видели мое обновление выше. остальное можно сделать с помощью всего вышеперечисленного, которое я написал вместе. Буду признателен, если вы примете ответ, если сочтете нужным. - person Kaveh Vahedipour; 14.06.2018
comment
Извините, я пропустил, похоже, это работает. Я боялся, что это может стать уродливым. Уверены, что нет более чистого способа сделать это? Я действительно не могу полагаться на маркеры, поскольку результат echo $i >> 1.out в моем случае не находится под моим контролем, и мне нужно будет убедиться, что мой маркер (сделанный в вашем коде) уникален. - person Erric; 14.06.2018