【问题标题】:NodeJS child_process: run two process in parallel over ssh and stream outputsNodeJS child_process:通过 ssh 和流输出并行运行两个进程
【发布时间】:2018-11-23 20:39:08
【问题描述】:

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

因此手头的问题:

我正在使用child_process 运行ssh binary 并连接到远程服务器。我可以通过生成的进程的stdinstdout 运行命令并获取它们的输出。但我有一个用例,我需要同时运行两个命令。一个是一个长时间运行的命令,我需要逐行流式传输,另一个是轻量级命令,其输入取决于流式传输行的内容。是否有可能做到这一点不产生两个 ssh 进程?

也欢迎使用 ssh2 或类似的解决方法。

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

Process 1 长时间运行并不断向标准输出/文件写入行,Process 2 需要在每一行上运行,就像Process 1 生成一行时一样。在每一点上,当一行的Process 2 完成时,我需要input line printed by Process 1the corresponding output of Process 2

【问题讨论】:

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


    【解决方案1】:

    有一个非常简单的方法:使用 gnu 并行。 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'
    

    【讨论】:

    • 但是我需要为第一个和第二个进程分别输出流。我如何通过并行实现这一点?
    • 让我看看。有趣。
    • 非常接近,但我的问题稍微复杂一些,我在问题中添加了一个更具描述性的示例
    • 剩下的就是编程了。我刚刚向您展示了如何远程并行启动 2 个程序。您描述的机制是两个交互的程序的编程问题。所以上面的第一个电话保持原样。第二个程序需要监听1.out上的文件事件并做事。但同样,这是一个编程问题。进程2是用什么编程语言编写的?你有密码吗?
    • 实际上我无法控制这两个进程,因为它们都是标准的 unix 命令。而且我在服务器上没有写入权限来编写包装程序/脚本。也许有一种完全不同于并行的方法?
    猜你喜欢
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 2021-10-20
    • 2013-11-22
    相关资源
    最近更新 更多