簡體   English   中英

NodeJS child_process:在ssh和流輸出上並行運行兩個進程

[英]NodeJS child_process: run two process in parallel over ssh and stream outputs

首先,使用ssh2可以輕松完成此操作,但是由於它不支持證書身份驗證 ,因此我無法使用它。

因此,眼下的問題是:

我正在使用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

有一個非常簡單的方法:使用gnu並行。 https://www.gnu.org/software/parallel/使用sudo apt -y install parallel安裝在Ubuntu fe上

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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM