NodeJS child_process:通过ssh和流输出并行运行两个进程

时间:2018-06-14 06:47:10

标签: node.js ssh parallel-processing stream child-process

首先,这可以通过ssh2轻松完成,但我无法使用它,因为it does not support certificate authentication

因此手头的问题:

我使用child_process来运行ssh binary并连接到远程服务器。我可以通过生成进程的stdinstdout来运行命令并获取其输出。但我有一个用例,我需要并行运行两个命令。一个是长时间运行的命令,我需要逐行流,另一个是轻量级命令,其输入取决于流线的内容。是否可以执行此而不会产生两个 ssh进程?

也欢迎使用ssh2或类似方法的变通办法。

(编辑)添加描述性示例:

Process 1一直在运行,并且一直在向stdout / file写入行,Process 2需要在Process 1生成一行的每一行上运行。在每一点,当一行的Process 2完成时,我需要input line printed by Process 1the corresponding output of Process 2

1 个答案:

答案 0 :(得分:0)

有一种非常简单的方法:使用gnu parallel。 https://www.gnu.org/software/parallel/ 它安装在Ubuntu f.e.与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到cat 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'