在ctrl + c上以bash方式终止管道子进程

时间:2017-06-25 07:03:29

标签: linux bash

假设我有两个文本文件,例如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)

如果在内部ctrl+c子进程完成之前按下cat,则在脚本终止时它们将在后台运行。如何修改此脚本,以便在使用cat关闭脚本时终止所有内部子进程(两个ctrl+c操作)?

编辑:如果可能,我不想使用循环。

1 个答案:

答案 0 :(得分:0)

我开始工作(欢迎评论):

#!/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};)