簡體   English   中英

在ctrl + c上終止bash中的管道子進程

[英]Terminating piped subprocesses in bash on ctrl+c

假設我有兩個文本文件,例如file1.txtfile2.txt ,它們在如下所示的腳本中聚合到單個流中:

#!/bin/bash
cat <( cat file1.txt | while read line; do sleep 1 && echo "first: $line" | tail -n +1; done & cat file2.txt | while read line; do sleep 1 && echo "second: $line" | tail -n +1; done)

如果在內部cat子進程完成之前按下ctrl+c則在腳本終止時它們將在后台運行。 我如何修改此腳本,以便在使用ctrl+c關閉腳本時終止所有內部子進程(兩個cat操作)?

編輯:如果可能,我不想使用循環。

我通過做得到工作(歡迎評論):

#!/bin/bash
trap kill_subprocesses INT

PID=`echo $$`
tempfile="temp.${PID}"
touch ${tempfile}

function kill_subprocesses {
    while read p; do
        kill "$p" || kill -2 "$p" || kill -9 "$p"
    done < "$tempfile"
    rm ${tempfile}
}

cat <( cat file1.txt | while read line; do sleep 1 && echo "first: $line" | tail -n +1; done & echo $! >> ${tempfile}; cat file2.txt | while read line; do sleep 1 && echo "second: $line" | tail -n +1; done & echo $! >> ${tempfile};)

暫無
暫無

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

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