[英]NodeJS child_process: run two process in parallel over ssh and stream outputs
首先,使用ssh2可以輕松完成此操作,但是由於它不支持證書身份驗證 ,因此我無法使用它。
因此,眼下的問題是:
我正在使用child_process
運行ssh binary
並連接到遠程服務器。 我可以運行命令並通過生成的進程的stdin
和stdout
獲取它們的輸出。 但是我有一個用例,其中我需要並行運行兩個命令 。 一個是運行時間很長的命令,我需要逐行流式傳輸,另一個是輕量級命令,其輸入取決於流式傳輸的行的內容。 是否可以在不產生兩個 ssh
進程的情況下做到這一點?
也歡迎使用ssh2或類似方法來解決。
(編輯)添加一個描述性示例:
Process 1
運行很長時間,並且一直在向stdout / file寫入行, Process 2
需要像在Process 1
產生一行時一樣在每行上運行。 在每一點上,當某行的Process 2
完成時,我需要input line printed by Process 1
和the 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.